From 679df3f2fb1624e2f949d6ef174ac2fea8afdb9b Mon Sep 17 00:00:00 2001 From: Leszek Godlewski Date: Sun, 27 Sep 2020 18:27:08 +0200 Subject: [PATCH 1/5] Bring the tr_create_render_target() declaration in line with t he definition --- tinydx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tinydx.h b/tinydx.h index ba19b3c..0cce98c 100644 --- a/tinydx.h +++ b/tinydx.h @@ -642,7 +642,7 @@ tr_api_export void tr_create_pipeline(tr_renderer* p_renderer, tr_shader_program tr_api_export void tr_create_compute_pipeline(tr_renderer* p_renderer, tr_shader_program* p_shader_program, tr_descriptor_set* p_descriptor_set, const tr_pipeline_settings* p_pipeline_settings, tr_pipeline** pp_pipeline); tr_api_export void tr_destroy_pipeline(tr_renderer* p_renderer, tr_pipeline* p_pipeline); -tr_api_export void tr_create_render_target(tr_renderer*p_renderer, uint32_t width, uint32_t height, tr_sample_count sample_count, tr_format color_format, uint32_t color_attachment_count, tr_format depth_stencil_format, tr_render_target** pp_render_target); +tr_api_export void tr_create_render_target(tr_renderer*p_renderer, uint32_t width, uint32_t height, tr_sample_count sample_count, tr_format color_format, uint32_t color_attachment_count, const tr_clear_value* p_color_clear_values, tr_format depth_stencil_format, const tr_clear_value* p_depth_stencil_clear_value, tr_render_target** pp_render_target); tr_api_export void tr_destroy_render_target(tr_renderer* p_renderer, tr_render_target* p_render_target); tr_api_export void tr_update_descriptor_set(tr_renderer* p_renderer, tr_descriptor_set* p_descriptor_set); From bd47a2e92e7a7091dcabafb5f9d2773560928900 Mon Sep 17 00:00:00 2001 From: Leszek Godlewski Date: Sun, 27 Sep 2020 18:28:28 +0200 Subject: [PATCH 2/5] Use SRV-compatible DXGI formats for depth texture SRVs --- tinydx.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tinydx.h b/tinydx.h index 0cce98c..719e27e 100644 --- a/tinydx.h +++ b/tinydx.h @@ -684,7 +684,7 @@ tr_api_export uint32_t tr_vertex_layout_stride(const tr_vertex_layout* p_vertex // Utility functions tr_api_export uint64_t tr_util_calc_storage_counter_offset(uint64_t buffer_size); tr_api_export uint32_t tr_util_calc_mip_levels(uint32_t width, uint32_t height); -tr_api_export DXGI_FORMAT tr_util_to_dx_format(tr_format format); +tr_api_export DXGI_FORMAT tr_util_to_dx_format(tr_format format, bool for_srv); tr_api_export tr_format tr_util_from_dx_format(DXGI_FORMAT fomat); tr_api_export uint32_t tr_util_format_stride(tr_format format); tr_api_export uint32_t tr_util_format_channel_count(tr_format format); @@ -2119,7 +2119,7 @@ uint32_t tr_util_calc_mip_levels(uint32_t width, uint32_t height) return result; } -DXGI_FORMAT tr_util_to_dx_format(tr_format format) +DXGI_FORMAT tr_util_to_dx_format(tr_format format, bool for_srv = false) { DXGI_FORMAT result = DXGI_FORMAT_UNKNOWN; switch (format) { @@ -2146,11 +2146,11 @@ DXGI_FORMAT tr_util_to_dx_format(tr_format format) case tr_format_r32g32b32a32_uint : result = DXGI_FORMAT_R32G32B32A32_UINT; break; case tr_format_r32g32b32a32_float : result = DXGI_FORMAT_R32G32B32A32_FLOAT; break; // Depth/stencil - case tr_format_d16_unorm : result = DXGI_FORMAT_D16_UNORM; break; - case tr_format_x8_d24_unorm_pack32 : result = DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; break; - case tr_format_d32_float : result = DXGI_FORMAT_D32_FLOAT; break; - case tr_format_d24_unorm_s8_uint : result = DXGI_FORMAT_D24_UNORM_S8_UINT; break; - case tr_format_d32_float_s8_uint : result = DXGI_FORMAT_D32_FLOAT_S8X24_UINT; break; + case tr_format_d16_unorm : result = for_srv ? DXGI_FORMAT_R16_UNORM : DXGI_FORMAT_D16_UNORM; break; + case tr_format_x8_d24_unorm_pack32 : result = for_srv ? DXGI_FORMAT_R24_UNORM_X8_TYPELESS : DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; break; + case tr_format_d32_float : result = for_srv ? DXGI_FORMAT_R32_FLOAT : DXGI_FORMAT_D32_FLOAT ; break; + case tr_format_d24_unorm_s8_uint : result = for_srv ? DXGI_FORMAT_R24_UNORM_X8_TYPELESS : DXGI_FORMAT_D24_UNORM_S8_UINT; break; + case tr_format_d32_float_s8_uint : result = for_srv ? DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS : DXGI_FORMAT_D32_FLOAT_S8X24_UINT; break; } return result; } @@ -3258,7 +3258,7 @@ void tr_internal_dx_create_buffer(tr_renderer* p_renderer, tr_buffer* p_buffer) case tr_buffer_usage_uniform_texel_srv: { D3D12_SHADER_RESOURCE_VIEW_DESC* desc = &(p_buffer->dx_srv_view_desc); - desc->Format = tr_util_to_dx_format(p_buffer->format); + desc->Format = tr_util_to_dx_format(p_buffer->format, true); desc->ViewDimension = D3D12_SRV_DIMENSION_BUFFER; desc->Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; desc->Buffer.FirstElement = p_buffer->first_element; @@ -3389,7 +3389,7 @@ void tr_internal_dx_create_texture(tr_renderer* p_renderer, tr_texture* p_textur assert(D3D12_SRV_DIMENSION_UNKNOWN != view_dim); p_texture->dx_srv_view_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - p_texture->dx_srv_view_desc.Format = tr_util_to_dx_format(p_texture->format); + p_texture->dx_srv_view_desc.Format = tr_util_to_dx_format(p_texture->format, true); p_texture->dx_srv_view_desc.ViewDimension = view_dim; p_texture->dx_srv_view_desc.Texture2D.MipLevels = (UINT)p_texture->mip_levels; } From ab0f1dd71e7e0d16be2d9aa974b38894c00e1e22 Mon Sep 17 00:00:00 2001 From: Leszek Godlewski Date: Sun, 27 Sep 2020 18:30:19 +0200 Subject: [PATCH 3/5] Fix the depth RT pixel format in D3D12 --- tinydx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tinydx.h b/tinydx.h index 719e27e..ef1da15 100644 --- a/tinydx.h +++ b/tinydx.h @@ -1750,7 +1750,7 @@ void tr_create_render_target( p_render_target->width, p_render_target->height, p_render_target->sample_count, - p_render_target->color_format, + p_render_target->depth_stencil_format, 1, p_depth_stencil_clear_value, false, From 12f5672a9db6f175973a585ad5d1577d7fe80d16 Mon Sep 17 00:00:00 2001 From: Leszek Godlewski Date: Sun, 27 Sep 2020 18:30:56 +0200 Subject: [PATCH 4/5] Log the error messages from D3D12SerializeRootSignature() --- tinydx.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tinydx.h b/tinydx.h index ef1da15..3f404ce 100644 --- a/tinydx.h +++ b/tinydx.h @@ -3741,6 +3741,10 @@ void tr_internal_dx_create_root_signature(tr_renderer* p_renderer, tr_descriptor else { hres = D3D12SerializeRootSignature(&(desc.Desc_1_0), D3D_ROOT_SIGNATURE_VERSION_1_0, &sig_blob, &error_msgs); } + if (error_msgs) + { + tr_internal_log(tr_log_type_error, (const char*)error_msgs->GetBufferPointer(), "D3D12SerializeRootSignature"); + } assert(SUCCEEDED(hres)); hres = p_renderer->dx_device->CreateRootSignature(0, sig_blob->GetBufferPointer(), sig_blob->GetBufferSize(), From 987c2a9aaaea7d0329960557482a2c38a3e77673 Mon Sep 17 00:00:00 2001 From: Leszek Godlewski Date: Sun, 27 Sep 2020 18:31:44 +0200 Subject: [PATCH 5/5] Use the correct Set{Graphics|Compute}RootDescriptorTable() call depending on pipeline type --- tinydx.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tinydx.h b/tinydx.h index 3f404ce..aaa86ac 100644 --- a/tinydx.h +++ b/tinydx.h @@ -4438,7 +4438,12 @@ void tr_internal_dx_cmd_bind_descriptor_sets(tr_cmd* p_cmd, tr_pipeline* p_pipel D3D12_GPU_DESCRIPTOR_HANDLE handle = p_descriptor_set->dx_sampler_heap->GetGPUDescriptorHandleForHeapStart(); UINT handle_inc_size = p_cmd->cmd_pool->renderer->dx_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); handle.ptr += descriptor->dx_heap_offset * handle_inc_size; - p_cmd->dx_cmd_list->SetGraphicsRootDescriptorTable(descriptor->dx_root_parameter_index, handle); + if (p_pipeline->type == tr_pipeline_type_graphics) { + p_cmd->dx_cmd_list->SetGraphicsRootDescriptorTable(descriptor->dx_root_parameter_index, handle); + } + else if (p_pipeline->type == tr_pipeline_type_compute) { + p_cmd->dx_cmd_list->SetComputeRootDescriptorTable(descriptor->dx_root_parameter_index, handle); + } } break;