Starting work on some of the Vd kernel functions.

This commit is contained in:
Ben Vanik 2013-05-28 20:00:06 -07:00
parent 2cecc02787
commit 61f7f6d28e
2 changed files with 101 additions and 4 deletions

View File

@ -24,7 +24,24 @@ namespace kernel {
namespace xboxkrnl { namespace xboxkrnl {
VOID xeVdQueryVideoMode(X_VIDEO_MODE *video_mode, bool swap) { // http://www.tweakoz.com/orkid/
// http://www.tweakoz.com/orkid/dox/d3/d52/xb360init_8cpp_source.html
// https://github.com/Free60Project/xenosfb/
// https://github.com/Free60Project/xenosfb/blob/master/src/xe.h
// https://github.com/gligli/libxemit
// http://web.archive.org/web/20090428095215/http://msdn.microsoft.com/en-us/library/bb313877.aspx
// http://web.archive.org/web/20100423054747/http://msdn.microsoft.com/en-us/library/bb313961.aspx
// http://web.archive.org/web/20100423054747/http://msdn.microsoft.com/en-us/library/bb313878.aspx
// http://web.archive.org/web/20090510235238/http://msdn.microsoft.com/en-us/library/bb313942.aspx
// http://svn.dd-wrt.com/browser/src/linux/universal/linux-3.8/drivers/gpu/drm/radeon/radeon_ring.c
// http://www.microsoft.com/en-za/download/details.aspx?id=5313 -- "Stripped Down Direct3D: Xbox 360 Command Buffer and Resource Management"
// VdQueryVideoFlags
// return 0x7?
void xeVdQueryVideoMode(X_VIDEO_MODE *video_mode, bool swap) {
if (video_mode == NULL) { if (video_mode == NULL) {
return; return;
} }
@ -36,7 +53,7 @@ VOID xeVdQueryVideoMode(X_VIDEO_MODE *video_mode, bool swap) {
video_mode->is_widescreen = 1; video_mode->is_widescreen = 1;
video_mode->is_hi_def = 1; video_mode->is_hi_def = 1;
video_mode->refresh_rate = 60.0f; video_mode->refresh_rate = 60.0f;
video_mode->video_standard = 1; video_mode->video_standard = 1; // NTSC
if (swap) { if (swap) {
video_mode->display_width = XESWAP32BE(video_mode->display_width); video_mode->display_width = XESWAP32BE(video_mode->display_width);
@ -63,10 +80,83 @@ SHIM_CALL VdQueryVideoMode_shim(
} }
void xeVdInitializeEngines(uint32_t unk0, uint32_t callback, uint32_t unk1,
uint32_t unk2_ptr, uint32_t unk3_ptr) {
// r3 = 0x4F810000
// r4 = function ptr (ready callback?)
// r5 = 0
// r6/r7 = some binary data in .data
}
SHIM_CALL VdInitializeEngines_shim(
xe_ppc_state_t* ppc_state, KernelState* state) {
uint32_t unk0 = SHIM_GET_ARG_32(0);
uint32_t callback = SHIM_GET_ARG_32(1);
uint32_t unk1 = SHIM_GET_ARG_32(2);
uint32_t unk2_ptr = SHIM_GET_ARG_32(3);
uint32_t unk3_ptr = SHIM_GET_ARG_32(4);
XELOGD(
"VdInitializeEngines(%.8X, %.8X, %.8X, %.8X, %.8X)",
unk0, callback, unk1, unk2_ptr, unk3_ptr);
xeVdInitializeEngines(unk0, callback, unk1, unk2_ptr, unk3_ptr);
}
void xeVdSetGraphicsInterruptCallback(uint32_t callback, uint32_t user_data) {
// callback takes 2 params
// r3 = bool 0/1 - 0 is normal interrupt, 1 is some acquire/lock mumble
// r4 = user_data (r4 of VdSetGraphicsInterruptCallback)
}
SHIM_CALL VdSetGraphicsInterruptCallback_shim(
xe_ppc_state_t* ppc_state, KernelState* state) {
uint32_t callback = SHIM_GET_ARG_32(0);
uint32_t user_data = SHIM_GET_ARG_32(1);
XELOGD(
"VdSetGraphicsInterruptCallback(%.8X, %.8X)",
callback, user_data);
xeVdSetGraphicsInterruptCallback(callback, user_data);
}
// VdInitializeRingBuffer // VdInitializeRingBuffer
// r3 = result of MmGetPhysicalAddress // r3 = result of MmGetPhysicalAddress
// r4 = number of pages? page size? // r4 = number of pages? page size?
// 0x8000 -> cntlzw=16 -> 0x1C - 16 = 12 // 0x8000 -> cntlzw=16 -> 0x1C - 16 = 12
// ring_buffer_t {
// uint 0
// uint buffer_0_size
// uint buffer_0_ptr
// uint buffer_1_size
// uint buffer_1_ptr
// uint segment_count -- 32 common
// }
// Buffer pointers are from MmAllocatePhysicalMemory with WRITE_COMBINE.
// Sizes could be zero? XBLA games seem to do this. Default sizes?
// D3D does size / region_count - must be > 1024
// void VdEnableRingBufferRPtrWriteBack
// r3 = ? pointer? doesn't look like a valid one
// r4 = 6, usually --- <=19
// Same value used to calculate the pointer is later written to
// Maybe GPU-memory relative?
// VdSetSystemCommandBufferGpuIdentifierAddress
// r3 = ?
// VdVerifyMEInitCommand
// r3
// r4 = 19
// no op?
} // namespace xboxkrnl } // namespace xboxkrnl
@ -77,4 +167,6 @@ SHIM_CALL VdQueryVideoMode_shim(
void xe::kernel::xboxkrnl::RegisterVideoExports( void xe::kernel::xboxkrnl::RegisterVideoExports(
ExportResolver* export_resolver, KernelState* state) { ExportResolver* export_resolver, KernelState* state) {
SHIM_SET_MAPPING("xboxkrnl.exe", VdQueryVideoMode, state); SHIM_SET_MAPPING("xboxkrnl.exe", VdQueryVideoMode, state);
SHIM_SET_MAPPING("xboxkrnl.exe", VdInitializeEngines, state);
SHIM_SET_MAPPING("xboxkrnl.exe", VdSetGraphicsInterruptCallback, state);
} }

View File

@ -20,6 +20,7 @@ namespace xe {
namespace kernel { namespace kernel {
namespace xboxkrnl { namespace xboxkrnl {
// http://ffplay360.googlecode.com/svn/trunk/Common/XTLOnPC.h // http://ffplay360.googlecode.com/svn/trunk/Common/XTLOnPC.h
#pragma pack(push, 1) #pragma pack(push, 1)
typedef struct { typedef struct {
@ -34,10 +35,14 @@ typedef struct {
} }
X_VIDEO_MODE; X_VIDEO_MODE;
#pragma pack(pop) #pragma pack(pop)
XEASSERTSTRUCTSIZE(X_VIDEO_MODE, 48); XEASSERTSTRUCTSIZE(X_VIDEO_MODE, 48);
VOID xeVdQueryVideoMode(X_VIDEO_MODE *video_mode, bool swap); void xeVdQueryVideoMode(X_VIDEO_MODE *video_mode, bool swap);
void xeVdInitializeEngines(uint32_t unk0, uint32_t callback, uint32_t unk1,
uint32_t unk2_ptr, uint32_t unk3_ptr);
void xeVdSetGraphicsInterruptCallback(uint32_t callback, uint32_t user_data);
} // namespace xboxkrnl } // namespace xboxkrnl
} // namespace kernel } // namespace kernel