This commit is contained in:
luboslenco
2025-08-11 11:26:39 +02:00
parent 2fee1bbd18
commit eb438c4889
+52 -216
View File
@@ -1171,150 +1171,54 @@ void gpu_raytrace_pipeline_init(gpu_raytrace_pipeline_t *pipeline, void *ray_sha
command_list->lpVtbl->QueryInterface(command_list , &IID_ID3D12GraphicsCommandList4, &dxr_command_list);
// Root signatures
D3D12_DESCRIPTOR_RANGE UAVDescriptor = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV,
.NumDescriptors = 1,
.BaseShaderRegister = 0,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
D3D12_DESCRIPTOR_RANGE ranges[] = {
{D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 1, 0, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND},
{D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 1, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND},
{D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 2, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND},
{D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 3, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND},
{D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 4, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND},
{D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 5, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND},
{D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 6, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND},
{D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 7, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND},
{D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 8, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND},
{D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 9, 0, D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND}
};
D3D12_DESCRIPTOR_RANGE SRVDescriptorA = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
.NumDescriptors = 1,
.BaseShaderRegister = 1,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
D3D12_ROOT_PARAMETER root_parameters[12] = {
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[0]}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_SRV, {0}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[1]}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[2]}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_CBV, {0}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[3]}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[4]}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[5]}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[6]}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[7]}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[8]}, D3D12_SHADER_VISIBILITY_ALL},
{D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, {1, &ranges[9]}, D3D12_SHADER_VISIBILITY_ALL}
};
D3D12_DESCRIPTOR_RANGE SRVDescriptorB = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
.NumDescriptors = 1,
.BaseShaderRegister = 2,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
};
D3D12_DESCRIPTOR_RANGE SRVDescriptor0 = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
.NumDescriptors = 1,
.BaseShaderRegister = 3,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
};
D3D12_DESCRIPTOR_RANGE SRVDescriptor1 = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
.NumDescriptors = 1,
.BaseShaderRegister = 4,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
};
D3D12_DESCRIPTOR_RANGE SRVDescriptor2 = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
.NumDescriptors = 1,
.BaseShaderRegister = 5,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
};
D3D12_DESCRIPTOR_RANGE SRVDescriptorEnv = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
.NumDescriptors = 1,
.BaseShaderRegister = 6,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
};
D3D12_DESCRIPTOR_RANGE SRVDescriptorSobol = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
.NumDescriptors = 1,
.BaseShaderRegister = 7,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
};
D3D12_DESCRIPTOR_RANGE SRVDescriptorScramble = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
.NumDescriptors = 1,
.BaseShaderRegister = 8,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
};
D3D12_DESCRIPTOR_RANGE SRVDescriptorRank = {
.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV,
.NumDescriptors = 1,
.BaseShaderRegister = 9,
.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND,
};
D3D12_ROOT_PARAMETER rootParameters[12] = {0};
// Output view
rootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[0].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[0].DescriptorTable.pDescriptorRanges = &UAVDescriptor;
// Acceleration structure
rootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV;
rootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[1].Descriptor.ShaderRegister = 0;
// Constant buffer
rootParameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[2].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[2].DescriptorTable.pDescriptorRanges = &SRVDescriptorA;
rootParameters[3].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[3].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[3].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[3].DescriptorTable.pDescriptorRanges = &SRVDescriptorB;
rootParameters[4].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
rootParameters[4].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[4].Descriptor.ShaderRegister = 0;
rootParameters[5].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[5].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[5].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[5].DescriptorTable.pDescriptorRanges = &SRVDescriptor0;
rootParameters[6].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[6].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[6].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[6].DescriptorTable.pDescriptorRanges = &SRVDescriptor1;
rootParameters[7].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[7].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[7].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[7].DescriptorTable.pDescriptorRanges = &SRVDescriptor2;
rootParameters[8].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[8].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[8].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[8].DescriptorTable.pDescriptorRanges = &SRVDescriptorEnv;
rootParameters[9].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[9].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[9].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[9].DescriptorTable.pDescriptorRanges = &SRVDescriptorSobol;
rootParameters[10].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[10].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[10].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[10].DescriptorTable.pDescriptorRanges = &SRVDescriptorScramble;
rootParameters[11].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[11].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParameters[11].DescriptorTable.NumDescriptorRanges = 1;
rootParameters[11].DescriptorTable.pDescriptorRanges = &SRVDescriptorRank;
D3D12_ROOT_SIGNATURE_DESC dxrRootSignatureDesc = {
.NumParameters = ARRAYSIZE(rootParameters),
.pParameters = rootParameters,
D3D12_ROOT_SIGNATURE_DESC root_signature_desc = {
.NumParameters = ARRAYSIZE(root_parameters),
.pParameters = root_parameters,
};
ID3DBlob *blob = NULL;
ID3DBlob *error = NULL;
D3D12SerializeRootSignature(&dxrRootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &blob, &error);
D3D12SerializeRootSignature(&root_signature_desc, D3D_ROOT_SIGNATURE_VERSION_1, &blob, &error);
if (dxr_root_signature != NULL) {
dxr_root_signature->lpVtbl->Release(dxr_root_signature);
}
device->lpVtbl->CreateRootSignature(device, 1, blob->lpVtbl->GetBufferPointer(blob), blob->lpVtbl->GetBufferSize(blob), &IID_ID3D12RootSignature,
&dxr_root_signature);
device->lpVtbl->CreateRootSignature(device, 1, blob->lpVtbl->GetBufferPointer(blob), blob->lpVtbl->GetBufferSize(blob), &IID_ID3D12RootSignature, &dxr_root_signature);
// Pipeline
D3D12_STATE_OBJECT_DESC raytracingPipeline = {
.Type = D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE,
};
D3D12_SHADER_BYTECODE shaderBytecode = {
.pShaderBytecode = ray_shader,
.BytecodeLength = ray_shader_size,
};
D3D12_DXIL_LIBRARY_DESC dxilLibrary = {
.DXILLibrary = shaderBytecode,
};
@@ -1330,34 +1234,26 @@ void gpu_raytrace_pipeline_init(gpu_raytrace_pipeline_t *pipeline, void *ray_sha
.HitGroupExport = L"hitgroup",
.Type = D3D12_HIT_GROUP_TYPE_TRIANGLES,
};
D3D12_RAYTRACING_SHADER_CONFIG shaderConfig = {
.MaxPayloadSizeInBytes = 10 * sizeof(float), // float4 color
.MaxAttributeSizeInBytes = 8 * sizeof(float), // float2 barycentrics
.MaxPayloadSizeInBytes = 10 * sizeof(float), // float4 color, float3 ray_origin, float3 ray_dir
.MaxAttributeSizeInBytes = 2 * sizeof(float), // float2 barycentrics
};
D3D12_RAYTRACING_PIPELINE_CONFIG pipelineConfig = {
.MaxTraceRecursionDepth = 1, // ~ primary rays only
};
D3D12_STATE_SUBOBJECT subobjects[5] = {0};
subobjects[0].Type = D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY;
subobjects[0].pDesc = &dxilLibrary;
subobjects[1].Type = D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP;
subobjects[1].pDesc = &hitGroup;
subobjects[2].Type = D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG;
subobjects[2].pDesc = &shaderConfig;
subobjects[3].Type = D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE;
subobjects[3].pDesc = &dxr_root_signature;
subobjects[4].Type = D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG;
subobjects[4].pDesc = &pipelineConfig;
D3D12_STATE_SUBOBJECT subobjects[5] = {
{ D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY, &dxilLibrary },
{ D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP, &hitGroup },
{ D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG, &shaderConfig },
{ D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE, &dxr_root_signature },
{ D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG, &pipelineConfig }
};
raytracingPipeline.NumSubobjects = 5;
raytracingPipeline.pSubobjects = subobjects;
dxr_device->lpVtbl->CreateStateObject(dxr_device, &raytracingPipeline, &IID_ID3D12StateObject, &pipeline->impl.state);
// Shader tables
// Get shader identifiers
ID3D12StateObjectProperties *stateObjectProps = NULL;
pipeline->impl.state->lpVtbl->QueryInterface(pipeline->impl.state , &IID_ID3D12StateObjectProperties, &stateObjectProps);
const void *rayGenShaderId = stateObjectProps->lpVtbl->GetShaderIdentifier(stateObjectProps, L"raygeneration");
@@ -1386,9 +1282,8 @@ void gpu_raytrace_pipeline_init(gpu_raytrace_pipeline_t *pipeline, void *ray_sha
.CreationNodeMask = 1,
.VisibleNodeMask = 1,
};
device->lpVtbl->CreateCommittedResource(device, &uploadHeapProperties, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, NULL,
&IID_ID3D12Resource, &pipeline->impl.raygen_shader_table);
&IID_ID3D12Resource, &pipeline->impl.raygen_shader_table);
D3D12_RANGE rstRange = {
.Begin = 0,
@@ -1521,7 +1416,6 @@ UINT create_srv_vb(gpu_buffer_t *vb, UINT numElements, UINT elementSize) {
device->lpVtbl->CreateShaderResourceView(device, vb->impl.buffer, &srvDesc, cpuDescriptor);
dxr_descriptor_heap->lpVtbl->GetGPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &handle);
dxr_vbgpu_descriptor_handle.ptr = handle.ptr + (INT64)(descriptorIndex) * (UINT64)(dxr_descriptor_size);
return descriptorIndex;
}
@@ -1564,7 +1458,6 @@ void gpu_raytrace_acceleration_structure_init(gpu_raytrace_acceleration_structur
}
void gpu_raytrace_acceleration_structure_add(gpu_raytrace_acceleration_structure_t *accel, gpu_buffer_t *vb, gpu_buffer_t *ib, iron_matrix4x4_t transform) {
int vb_i = -1;
for (int i = 0; i < dxr_vb_count; ++i) {
if (vb == dxr_vb[i]) {
@@ -1595,7 +1488,6 @@ void _gpu_raytrace_acceleration_structure_destroy_top(gpu_raytrace_acceleration_
}
void gpu_raytrace_acceleration_structure_build(gpu_raytrace_acceleration_structure_t *accel, gpu_buffer_t *vb_full, gpu_buffer_t *ib_full) {
bool build_bottom = false;
for (int i = 0; i < 16; ++i) {
if (dxr_vb_last[i] != dxr_vb[i]) {
@@ -1627,10 +1519,8 @@ void gpu_raytrace_acceleration_structure_build(gpu_raytrace_acceleration_structu
create_srv_vb(dxr_vb[0], dxr_vb[0]->count, dxr_vb[0]->stride);
#endif
// Reset the command list for the acceleration structure construction
command_list->lpVtbl->Reset(command_list, command_allocator, NULL);
// Get required sizes for an acceleration structure
D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS topLevelInputs = {
.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY,
.Flags = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PREFER_FAST_TRACE,
@@ -1682,9 +1572,6 @@ void gpu_raytrace_acceleration_structure_build(gpu_raytrace_acceleration_structu
scratch_size = blSize;
}
// Allocate resources for acceleration structures
// The resources that will contain acceleration structures must be created in the state D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE,
// and must have resource flag D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS.
{
D3D12_RESOURCE_DESC bufferDesc = {
.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER,
@@ -1738,14 +1625,11 @@ void gpu_raytrace_acceleration_structure_build(gpu_raytrace_acceleration_structu
// Bottom AS
if (build_bottom) {
for (int i = 0; i < dxr_vb_count; ++i) {
// Bottom Level Acceleration Structure desc
D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC bottomLevelBuildDesc = {
.Inputs = bottomLevelInputs[i],
.ScratchAccelerationStructureData = scratchResource->lpVtbl->GetGPUVirtualAddress(scratchResource),
.DestAccelerationStructureData = accel->impl.bottom_level_accel[i]->lpVtbl->GetGPUVirtualAddress(accel->impl.bottom_level_accel[i]),
};
// Build acceleration structure
dxr_command_list->lpVtbl->BuildRaytracingAccelerationStructure(dxr_command_list, &bottomLevelBuildDesc, 0, NULL);
}
}
@@ -1774,7 +1658,6 @@ void gpu_raytrace_acceleration_structure_build(gpu_raytrace_acceleration_structu
&IID_ID3D12Resource, &accel->impl.top_level_accel);
}
// Create an instance desc for the bottom-level acceleration structure
D3D12_RESOURCE_DESC bufferDesc = {
.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER,
.Width = sizeof(D3D12_RAYTRACING_INSTANCE_DESC) * dxr_instances_count,
@@ -1820,14 +1703,12 @@ void gpu_raytrace_acceleration_structure_build(gpu_raytrace_acceleration_structu
}
instanceDesc.InstanceID = ib_off;
instanceDesc.InstanceMask = 1;
instanceDesc.AccelerationStructure =
accel->impl.bottom_level_accel[dxr_instances[i].i]->lpVtbl->GetGPUVirtualAddress(accel->impl.bottom_level_accel[dxr_instances[i].i]);
instanceDesc.AccelerationStructure = accel->impl.bottom_level_accel[dxr_instances[i].i]->lpVtbl->GetGPUVirtualAddress(accel->impl.bottom_level_accel[dxr_instances[i].i]);
memcpy((uint8_t *)mappedData + i * sizeof(D3D12_RAYTRACING_INSTANCE_DESC), &instanceDesc, sizeof(D3D12_RAYTRACING_INSTANCE_DESC));
}
instanceDescs->lpVtbl->Unmap(instanceDescs, 0, NULL);
// Top Level Acceleration Structure desc
D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC topLevelBuildDesc = {0};
topLevelInputs.InstanceDescs = instanceDescs->lpVtbl->GetGPUVirtualAddress(instanceDescs);
topLevelBuildDesc.Inputs = topLevelInputs;
@@ -1853,61 +1734,19 @@ void gpu_raytrace_acceleration_structure_destroy(gpu_raytrace_acceleration_struc
}
void gpu_raytrace_set_textures(gpu_texture_t *texpaint0, gpu_texture_t *texpaint1, gpu_texture_t *texpaint2, gpu_texture_t *texenv, gpu_texture_t *texsobol, gpu_texture_t *texscramble, gpu_texture_t *texrank) {
D3D12_CPU_DESCRIPTOR_HANDLE handle;
dxr_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &handle);
D3D12_CPU_DESCRIPTOR_HANDLE handle, cpuDescriptor, sourceCpu;
D3D12_GPU_DESCRIPTOR_HANDLE ghandle;
gpu_texture_t *textures[] = {texpaint0, texpaint1, texpaint2, texenv, texsobol, texscramble, texrank};
D3D12_GPU_DESCRIPTOR_HANDLE *gpu_handles[] = {&dxr_tex0gpu_descriptor_handle, &dxr_tex1gpu_descriptor_handle, &dxr_tex2gpu_descriptor_handle, &dxr_texenvgpu_descriptor_handle, &dxr_texsobolgpu_descriptor_handle, &dxr_texscramblegpu_descriptor_handle, &dxr_texrankgpu_descriptor_handle};
D3D12_CPU_DESCRIPTOR_HANDLE cpuDescriptor = {0};
cpuDescriptor.ptr = handle.ptr + 5 * (UINT64)(dxr_descriptor_size);
D3D12_CPU_DESCRIPTOR_HANDLE sourceCpu;
texpaint0->impl.srv_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(texpaint0->impl.srv_descriptor_heap, &sourceCpu);
device->lpVtbl->CopyDescriptorsSimple(device, 1, cpuDescriptor, sourceCpu, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
D3D12_GPU_DESCRIPTOR_HANDLE ghandle;
dxr_descriptor_heap->lpVtbl->GetGPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &ghandle);
dxr_tex0gpu_descriptor_handle.ptr = ghandle.ptr + 5 * (UINT64)(dxr_descriptor_size);
dxr_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &handle);
cpuDescriptor.ptr = handle.ptr + 6 * (UINT64)(dxr_descriptor_size);
texpaint1->impl.srv_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(texpaint1->impl.srv_descriptor_heap, &sourceCpu);
device->lpVtbl->CopyDescriptorsSimple(device, 1, cpuDescriptor, sourceCpu, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
dxr_descriptor_heap->lpVtbl->GetGPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &ghandle);
dxr_tex1gpu_descriptor_handle.ptr = ghandle.ptr + 6 * (UINT64)(dxr_descriptor_size);
dxr_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &handle);
cpuDescriptor.ptr = handle.ptr + 7 * (UINT64)(dxr_descriptor_size);
texpaint2->impl.srv_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(texpaint2->impl.srv_descriptor_heap, &sourceCpu);
device->lpVtbl->CopyDescriptorsSimple(device, 1, cpuDescriptor, sourceCpu, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
dxr_descriptor_heap->lpVtbl->GetGPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &ghandle);
dxr_tex2gpu_descriptor_handle.ptr = ghandle.ptr + 7 * (UINT64)(dxr_descriptor_size);
dxr_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &handle);
cpuDescriptor.ptr = handle.ptr + 8 * (UINT64)(dxr_descriptor_size);
texenv->impl.srv_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(texenv->impl.srv_descriptor_heap, &sourceCpu);
device->lpVtbl->CopyDescriptorsSimple(device, 1, cpuDescriptor, sourceCpu, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
dxr_descriptor_heap->lpVtbl->GetGPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &ghandle);
dxr_texenvgpu_descriptor_handle.ptr = ghandle.ptr + 8 * (UINT64)(dxr_descriptor_size);
dxr_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &handle);
cpuDescriptor.ptr = handle.ptr + 9 * (UINT64)(dxr_descriptor_size);
texsobol->impl.srv_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(texsobol->impl.srv_descriptor_heap, &sourceCpu);
device->lpVtbl->CopyDescriptorsSimple(device, 1, cpuDescriptor, sourceCpu, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
dxr_descriptor_heap->lpVtbl->GetGPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &ghandle);
dxr_texsobolgpu_descriptor_handle.ptr = ghandle.ptr + 9 * (UINT64)(dxr_descriptor_size);
dxr_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &handle);
cpuDescriptor.ptr = handle.ptr + 10 * (UINT64)(dxr_descriptor_size);
texscramble->impl.srv_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(texscramble->impl.srv_descriptor_heap , &sourceCpu);
device->lpVtbl->CopyDescriptorsSimple(device, 1, cpuDescriptor, sourceCpu, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
dxr_descriptor_heap->lpVtbl->GetGPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &ghandle);
dxr_texscramblegpu_descriptor_handle.ptr = ghandle.ptr + 10 * (UINT64)(dxr_descriptor_size);
dxr_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &handle);
cpuDescriptor.ptr = handle.ptr + 11 * (UINT64)(dxr_descriptor_size);
texrank->impl.srv_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(texrank->impl.srv_descriptor_heap , &sourceCpu);
device->lpVtbl->CopyDescriptorsSimple(device, 1, cpuDescriptor, sourceCpu, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
dxr_descriptor_heap->lpVtbl->GetGPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &ghandle);
dxr_texrankgpu_descriptor_handle.ptr = ghandle.ptr + 11 * (UINT64)(dxr_descriptor_size);
dxr_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &handle);
for (int i = 0; i < 7; i++) {
cpuDescriptor.ptr = handle.ptr + (5 + i) * (UINT64)dxr_descriptor_size;
textures[i]->impl.srv_descriptor_heap->lpVtbl->GetCPUDescriptorHandleForHeapStart(textures[i]->impl.srv_descriptor_heap, &sourceCpu);
device->lpVtbl->CopyDescriptorsSimple(device, 1, cpuDescriptor, sourceCpu, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
dxr_descriptor_heap->lpVtbl->GetGPUDescriptorHandleForHeapStart(dxr_descriptor_heap, &ghandle);
gpu_handles[i]->ptr = ghandle.ptr + (5 + i) * (UINT64)dxr_descriptor_size;
}
}
void gpu_raytrace_set_acceleration_structure(gpu_raytrace_acceleration_structure_t *accel) {
@@ -1997,8 +1836,6 @@ void gpu_raytrace_set_target(gpu_texture_t *output) {
void gpu_raytrace_dispatch_rays() {
command_list->lpVtbl->SetComputeRootSignature(command_list, dxr_root_signature);
// Bind the heaps, acceleration structure and dispatch rays
command_list->lpVtbl->SetDescriptorHeaps(command_list, 1, &dxr_descriptor_heap);
command_list->lpVtbl->SetComputeRootDescriptorTable(command_list, 0, dxr_output_descriptor_handle);
command_list->lpVtbl->SetComputeRootShaderResourceView(command_list, 1, dxr_accel->impl.top_level_accel->lpVtbl->GetGPUVirtualAddress(dxr_accel->impl.top_level_accel));
@@ -2013,7 +1850,6 @@ void gpu_raytrace_dispatch_rays() {
command_list->lpVtbl->SetComputeRootDescriptorTable(command_list, 10, dxr_texscramblegpu_descriptor_handle);
command_list->lpVtbl->SetComputeRootDescriptorTable(command_list, 11, dxr_texrankgpu_descriptor_handle);
// Since each shader table has only one shader record, the stride is same as the size.
D3D12_DISPATCH_RAYS_DESC dispatchDesc = {0};
D3D12_RESOURCE_DESC desc;
dxr_pipeline->impl.hitgroup_shader_table->lpVtbl->GetDesc(dxr_pipeline->impl.hitgroup_shader_table, &desc);