diff options
author | Lucas Fryzek <lucas.fryzek@fryzekconcepts.com> | 2024-08-03 12:47:29 +0100 |
---|---|---|
committer | Lucas Fryzek <lucas.fryzek@fryzekconcepts.com> | 2024-08-03 12:47:29 +0100 |
commit | deb35af5181d960c4334414981b8fd3e603a94b3 (patch) | |
tree | c8cbd61efbe2605c856a738a4dc04f74eb98fd13 | |
parent | e2434d86f69c7fac1894ff321bc06f1f5ef085ca (diff) |
drv: Add code to create hw render ctx
-rw-r--r-- | src/drv.c | 110 |
1 files changed, 107 insertions, 3 deletions
@@ -42,7 +42,16 @@ struct driver_state { IMG_HANDLE global_eventobject; PVRSRV_HEAP_INFO kernel_heap; + PVRSRV_HEAP_INFO perctx_3d_heap; + PVRSRV_HEAP_INFO ta_data_heap; PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM ccb_buffer; + PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM kernel_buffer_2; + PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM kernel_buffer_3; + PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM perctx_3d_buffer; + PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM ta_data_buffer; + + IMG_HANDLE hw_render_ctx; + IMG_DEV_VIRTADDR hw_render_ctx_addr; }; static void check_pvr_error(PVRSRV_ERROR error) { @@ -271,9 +280,19 @@ static void get_dev_mem_heapinfo(struct driver_state *state) { if (out.sHeapInfo[i].ui32HeapID == HEAP_ID( PVRSRV_DEVICE_TYPE_SGX, SGX_KERNEL_DATA_HEAP_ID)) { state->kernel_heap = out.sHeapInfo[i]; } + + if (out.sHeapInfo[i].ui32HeapID == HEAP_ID( PVRSRV_DEVICE_TYPE_SGX, SGX_TADATA_HEAP_ID)) { + state->ta_data_heap = out.sHeapInfo[i]; + } + + if (out.sHeapInfo[i].ui32HeapID == HEAP_ID( PVRSRV_DEVICE_TYPE_SGX, SGX_PERCONTEXT_3DPARAMETERS_HEAP_ID)) { + state->perctx_3d_heap = out.sHeapInfo[i]; + } } assert(state->kernel_heap.ui32HeapID != 0); + assert(state->ta_data_heap.ui32HeapID != 0); + assert(state->perctx_3d_heap.ui32HeapID != 0); } static PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM allocate_memobj(struct driver_state *state, PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM *alloc) { @@ -281,8 +300,8 @@ static PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM allocate_memobj(struct driver_state *sta PVRSRV_BRIDGE_PACKAGE data = { .ui32BridgeID = PVRSRV_BRIDGE_ALLOC_DEVICEMEM, .ui32Size = sizeof(data), - .pvParamIn = &alloc, - .ui32InBufferSize = sizeof(alloc), + .pvParamIn = alloc, + .ui32InBufferSize = sizeof(*alloc), .pvParamOut = &out, .ui32OutBufferSize = sizeof(out), .hKernelServices = state->kernel_services @@ -303,8 +322,92 @@ static void allocate_memory(struct driver_state *state) { .uSize = 0x86a4, .uAlignment = 0x1000, }; - state->ccb_buffer = allocate_memobj(state, &alloc_CCB); + + PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM alloc_kernel_buffer_2 = { + .hDevCookie = state->dev_cookie, + .hDevMemHeap = state->kernel_heap.hDevMemHeap, + .ui32Attribs = PVRSRV_MEM_READ | PVRSRV_MEM_WRITE | PVRSRV_MEM_CACHE_CONSISTENT | PVRSRV_MEM_NO_SYNCOBJ | PVRSRV_MEM_EDM_PROTECT, + .uSize = 0x8, + .uAlignment = 0x20, + }; + state->kernel_buffer_2 = allocate_memobj(state, &alloc_kernel_buffer_2); + + PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM alloc_kernel_buffer_3 = { + .hDevCookie = state->dev_cookie, + .hDevMemHeap = state->kernel_heap.hDevMemHeap, + .ui32Attribs = PVRSRV_MEM_READ | PVRSRV_MEM_WRITE | PVRSRV_MEM_CACHE_CONSISTENT | PVRSRV_MEM_NO_SYNCOBJ, + .uSize = 0x44, + .uAlignment = 0x20, + }; + state->kernel_buffer_3 = allocate_memobj(state, &alloc_kernel_buffer_3); + + PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM alloc_perctx_3d_buffer = { + .hDevCookie = state->dev_cookie, + .hDevMemHeap = state->perctx_3d_heap.hDevMemHeap, + .ui32Attribs = PVRSRV_MEM_READ | PVRSRV_MEM_WRITE | PVRSRV_MEM_NO_SYNCOBJ, + .uSize = 0x40, + .uAlignment = 0x40, + }; + state->perctx_3d_buffer = allocate_memobj(state, &alloc_perctx_3d_buffer); + + PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM alloc_ta_data_buffer = { + .hDevCookie = state->dev_cookie, + .hDevMemHeap = state->ta_data_heap.hDevMemHeap, + .ui32Attribs = PVRSRV_MEM_READ | PVRSRV_MEM_WRITE | PVRSRV_MEM_NO_SYNCOBJ, + .uSize = 0xc0, + .uAlignment = 0x40, + }; + state->ta_data_buffer = allocate_memobj(state, &alloc_ta_data_buffer); +} + +static void register_hw_render_ctx(struct driver_state *state) { + /* Data copied directly from dump on hw + * Not sure what other params mean, but the buffer + * ones are obvious once you start offsetting buffer addresses + */ + uint32_t render_ctx[] = { + 0x21, + 0x1, + 0x0, + state->ccb_buffer.sClientMemInfo.sDevVAddr.uiAddr, + state->kernel_buffer_2.sClientMemInfo.sDevVAddr.uiAddr, + 0x0, + state->kernel_buffer_3.sClientMemInfo.sDevVAddr.uiAddr, + state->perctx_3d_buffer.sClientMemInfo.sDevVAddr.uiAddr, + state->ta_data_buffer.sClientMemInfo.sDevVAddr.uiAddr, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x50f, + }; + PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT in = { + .hDevCookie = state->dev_cookie, + .pHWRenderContextCpuVAddr = render_ctx, + .ui32HWRenderContextSize = sizeof(render_ctx), + .hDevMemContext = state->dev_mem_context, + }; + PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT out; + PVRSRV_BRIDGE_PACKAGE data = { + .ui32BridgeID = PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT, + .ui32Size = sizeof(data), + .pvParamIn = &in, + .ui32InBufferSize = sizeof(in), + .pvParamOut = &out, + .ui32OutBufferSize = sizeof(out), + .hKernelServices = state->kernel_services + }; + + check_ioctl(state->fd, DRM_IOCTL_PVR_SRVKM, &data); + check_pvr_error(out.eError); + + state->hw_render_ctx = out.hHWRenderContext; + state->hw_render_ctx_addr = out.sHWRenderContextDevVAddr; } int main(int argc, char *argv[]) { @@ -337,6 +440,7 @@ int main(int argc, char *argv[]) { open_eventobject(&state); get_dev_mem_heapinfo(&state); allocate_memory(&state); + register_hw_render_ctx(&state); close(state.fd); |