From 7ae680d9d103aec94195133efb862e4c6cad0bc6 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sun, 21 Feb 2016 22:15:18 +0100 Subject: [PATCH 1/3] d3d12: Avoid uploading constant buffer every draw call --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 16 +++++++++++----- rpcs3/Emu/RSX/D3D12/D3D12GSRender.h | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 25bf88da16..49fcbc9dc4 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -319,11 +319,17 @@ void D3D12GSRender::end() .Offset((INT)currentDescriptorIndex + vertex_buffer_count, m_descriptor_stride_srv_cbv_uav) ); - upload_and_bind_vertex_shader_constants(currentDescriptorIndex + 1 + vertex_buffer_count); - get_current_resource_storage().command_list->SetGraphicsRootDescriptorTable(VERTEX_CONSTANT_BUFFERS_SLOT, - CD3DX12_GPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetGPUDescriptorHandleForHeapStart()) - .Offset((INT)currentDescriptorIndex + 1 + vertex_buffer_count, m_descriptor_stride_srv_cbv_uav) - ); + if (m_transform_constants_dirty) + { + m_current_transform_constants_buffer_descriptor_id = (u32)currentDescriptorIndex + 1 + vertex_buffer_count; + upload_and_bind_vertex_shader_constants(currentDescriptorIndex + 1 + vertex_buffer_count); + m_transform_constants_dirty = false; + get_current_resource_storage().command_list->SetGraphicsRootDescriptorTable(VERTEX_CONSTANT_BUFFERS_SLOT, + CD3DX12_GPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetGPUDescriptorHandleForHeapStart()) + .Offset(m_current_transform_constants_buffer_descriptor_id, m_descriptor_stride_srv_cbv_uav) + ); + } + std::chrono::time_point constants_duration_end = std::chrono::system_clock::now(); m_timers.constants_duration += std::chrono::duration_cast(constants_duration_end - constants_duration_start).count(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index bd7d94740e..de5e06bb4c 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -128,6 +128,7 @@ private: ID3D12Resource *m_dummy_texture; // Currently used shader resources / samplers descriptor + u32 m_current_transform_constants_buffer_descriptor_id; std::array, 16> m_current_shader_resources = {}; std::array m_current_samplers = {}; public: From 263e5beb26ae14001cc1cdb25470ff8d40a6aa5c Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Mon, 22 Feb 2016 19:55:24 +0100 Subject: [PATCH 2/3] d3d12: Copy descriptors when reused instead of recreating them. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks Matías N. Goldberg for the tip ! --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 33 +++++++++++++++------------ rpcs3/Emu/RSX/D3D12/D3D12GSRender.h | 4 ++-- rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp | 22 ++++++++++++++---- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 49fcbc9dc4..c66d84eddf 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -179,6 +179,12 @@ D3D12GSRender::D3D12GSRender() m_device->CreateDescriptorHeap(&render_target_descriptor_heap_desc, IID_PPV_ARGS(&m_backbuffer_descriptor_heap[1])); m_device->CreateRenderTargetView(m_backbuffer[1].Get(), &renter_target_view_desc, m_backbuffer_descriptor_heap[1]->GetCPUDescriptorHandleForHeapStart()); + + D3D12_DESCRIPTOR_HEAP_DESC current_texture_descriptors_desc = { D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 16 }; + CHECK_HRESULT(m_device->CreateDescriptorHeap(¤t_texture_descriptors_desc, IID_PPV_ARGS(m_current_texture_descriptors.GetAddressOf()))); + D3D12_DESCRIPTOR_HEAP_DESC current_sampler_descriptors_desc = { D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, 16 }; + CHECK_HRESULT(m_device->CreateDescriptorHeap(¤t_sampler_descriptors_desc, IID_PPV_ARGS(m_current_sampler_descriptors.GetAddressOf()))); + ComPtr root_signature_blob = get_shared_root_signature_blob(); m_device->CreateRootSignature(0, @@ -344,20 +350,19 @@ void D3D12GSRender::end() { upload_textures(get_current_resource_storage().command_list.Get(), texture_count); - // Bind texture and samplers - for (u32 i = 0; i < texture_count; i++) - { - ID3D12Resource *tex_resource; - D3D12_SHADER_RESOURCE_VIEW_DESC srv; - std::tie(tex_resource, srv) = m_current_shader_resources[i]; - m_device->CreateShaderResourceView(tex_resource, &srv, - CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetCPUDescriptorHandleForHeapStart()) - .Offset((UINT)get_current_resource_storage().descriptors_heap_index + i, m_descriptor_stride_srv_cbv_uav) - ); - m_device->CreateSampler(&m_current_samplers[i], - CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().sampler_descriptor_heap[get_current_resource_storage().sampler_descriptors_heap_index]->GetCPUDescriptorHandleForHeapStart()) - .Offset((UINT)get_current_resource_storage().current_sampler_index + i, m_descriptor_stride_samplers)); - } + m_device->CopyDescriptorsSimple(16, + CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetCPUDescriptorHandleForHeapStart()) + .Offset((UINT)get_current_resource_storage().descriptors_heap_index, m_descriptor_stride_srv_cbv_uav), + CD3DX12_CPU_DESCRIPTOR_HANDLE(m_current_texture_descriptors->GetCPUDescriptorHandleForHeapStart()), + D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV + ); + + m_device->CopyDescriptorsSimple(16, + CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().sampler_descriptor_heap[get_current_resource_storage().sampler_descriptors_heap_index]->GetCPUDescriptorHandleForHeapStart()) + .Offset((UINT)get_current_resource_storage().current_sampler_index, m_descriptor_stride_samplers), + CD3DX12_CPU_DESCRIPTOR_HANDLE(m_current_sampler_descriptors->GetCPUDescriptorHandleForHeapStart()), + D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER + ); get_current_resource_storage().command_list->SetGraphicsRootDescriptorTable(TEXTURES_SLOT, CD3DX12_GPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetGPUDescriptorHandleForHeapStart()) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index de5e06bb4c..1c0e7cf99d 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -129,8 +129,8 @@ private: // Currently used shader resources / samplers descriptor u32 m_current_transform_constants_buffer_descriptor_id; - std::array, 16> m_current_shader_resources = {}; - std::array m_current_samplers = {}; + ComPtr m_current_texture_descriptors; + ComPtr m_current_sampler_descriptors; public: D3D12GSRender(); virtual ~D3D12GSRender(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp index 54fdb478b4..35959c1b65 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp @@ -194,14 +194,22 @@ void D3D12GSRender::upload_textures(ID3D12GraphicsCommandList *command_list, siz D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0, D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0, D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0); - m_current_shader_resources[i] = std::make_tuple(m_dummy_texture, shader_resource_view_desc); + + m_device->CreateShaderResourceView(m_dummy_texture, &shader_resource_view_desc, + CD3DX12_CPU_DESCRIPTOR_HANDLE(m_current_texture_descriptors->GetCPUDescriptorHandleForHeapStart()) + .Offset((UINT)i, m_descriptor_stride_srv_cbv_uav) + ); D3D12_SAMPLER_DESC sampler_desc = {}; sampler_desc.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT; sampler_desc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP; sampler_desc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP; sampler_desc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP; - m_current_samplers[i] = sampler_desc; + + m_device->CreateSampler(&sampler_desc, + CD3DX12_CPU_DESCRIPTOR_HANDLE(m_current_sampler_descriptors->GetCPUDescriptorHandleForHeapStart()) + .Offset((UINT)i, m_descriptor_stride_samplers)); + continue; } size_t w = textures[i].width(), h = textures[i].height(); @@ -354,7 +362,10 @@ void D3D12GSRender::upload_textures(ID3D12GraphicsCommandList *command_list, siz break; } - m_current_shader_resources[i] = std::make_tuple(vram_texture, shared_resource_view_desc); + m_device->CreateShaderResourceView(vram_texture, &shared_resource_view_desc, + CD3DX12_CPU_DESCRIPTOR_HANDLE(m_current_texture_descriptors->GetCPUDescriptorHandleForHeapStart()) + .Offset((UINT)i, m_descriptor_stride_srv_cbv_uav) + ); if (get_current_resource_storage().current_sampler_index + 16 > 2048) { @@ -368,7 +379,10 @@ void D3D12GSRender::upload_textures(ID3D12GraphicsCommandList *command_list, siz }; command_list->SetDescriptorHeaps(2, descriptors); } - m_current_samplers[i] = get_sampler_desc(textures[i]); + + m_device->CreateSampler(&get_sampler_desc(textures[i]), + CD3DX12_CPU_DESCRIPTOR_HANDLE(m_current_sampler_descriptors->GetCPUDescriptorHandleForHeapStart()) + .Offset((UINT)i, m_descriptor_stride_samplers)); } } #endif From a78ba8a271f8eb3f8d79242d3bf38ba68097f74c Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Mon, 22 Feb 2016 20:10:44 +0100 Subject: [PATCH 3/3] d3d12: Remove depth conversion shader It's actually not needed, raw depth data should be sampled as RGBA8. --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 3 - rpcs3/Emu/RSX/D3D12/D3D12GSRender.h | 7 --- rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp | 57 ++---------------- rpcs3/Emu/RSX/D3D12/D3D12Utils.cpp | 60 ------------------- 4 files changed, 5 insertions(+), 122 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index c66d84eddf..034324d839 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -197,7 +197,6 @@ D3D12GSRender::D3D12GSRender() m_per_frame_storage[1].init(m_device.Get()); m_per_frame_storage[1].reset(); - init_convert_shader(); m_output_scaling_pass.init(m_device.Get(), m_command_queue.Get()); CHECK_HRESULT( @@ -236,8 +235,6 @@ D3D12GSRender::~D3D12GSRender() m_texture_cache.unprotect_all(); m_dummy_texture->Release(); - m_convert_pso->Release(); - m_convert_root_signature->Release(); m_per_frame_storage[0].release(); m_per_frame_storage[1].release(); m_output_scaling_pass.release(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 1c0e7cf99d..e5db7bc3b9 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -101,13 +101,6 @@ private: */ shader m_output_scaling_pass; - /** - * Data used when depth buffer is converted to uchar textures. - */ - ID3D12PipelineState *m_convert_pso; - ID3D12RootSignature *m_convert_root_signature; - void init_convert_shader(); - resource_storage m_per_frame_storage[2]; resource_storage &get_current_resource_storage(); resource_storage &get_non_current_resource_storage(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp index 8f1fd989a3..033dee93b5 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp @@ -298,9 +298,7 @@ void D3D12GSRender::copy_render_target_to_dma_location() int clip_w = rsx::method_registers[NV4097_SET_SURFACE_CLIP_HORIZONTAL] >> 16; int clip_h = rsx::method_registers[NV4097_SET_SURFACE_CLIP_VERTICAL] >> 16; - ComPtr depth_format_conversion_buffer; - ComPtr descriptor_heap; - size_t depth_row_pitch = align(clip_w, 256); + size_t depth_row_pitch = align(clip_w * 4, 256); size_t depth_buffer_offset_in_heap = 0; u32 context_dma_color[] = @@ -334,55 +332,10 @@ void D3D12GSRender::copy_render_target_to_dma_location() if (m_context_dma_z && rpcs3::state.config.rsx.opengl.write_depth_buffer) { - size_t uav_size = clip_w * clip_h * 2; - - CHECK_HRESULT( - m_device->CreateCommittedResource( - &D3D12_HEAP_PROPERTIES{D3D12_HEAP_TYPE_DEFAULT}, - D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_R8_UNORM, clip_w, clip_h, 1, 1, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS), - D3D12_RESOURCE_STATE_UNORDERED_ACCESS, - nullptr, - IID_PPV_ARGS(depth_format_conversion_buffer.GetAddressOf()) - ) - ); - - D3D12_DESCRIPTOR_HEAP_DESC descriptor_heap_desc = { D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV , 2, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE }; - CHECK_HRESULT( - m_device->CreateDescriptorHeap(&descriptor_heap_desc, IID_PPV_ARGS(descriptor_heap.GetAddressOf())) - ); - D3D12_SHADER_RESOURCE_VIEW_DESC shader_resource_view_desc = {}; - shader_resource_view_desc.Format = get_depth_samplable_surface_format(m_surface.depth_format); - shader_resource_view_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - shader_resource_view_desc.Texture2D.MipLevels = 1; - shader_resource_view_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - m_device->CreateShaderResourceView(std::get<1>(m_rtts.m_bound_depth_stencil), &shader_resource_view_desc, - CD3DX12_CPU_DESCRIPTOR_HANDLE(descriptor_heap->GetCPUDescriptorHandleForHeapStart())); - D3D12_UNORDERED_ACCESS_VIEW_DESC uav_desc = {}; - uav_desc.Format = DXGI_FORMAT_R8_UNORM; - uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - m_device->CreateUnorderedAccessView(depth_format_conversion_buffer.Get(), nullptr, &uav_desc, - CD3DX12_CPU_DESCRIPTOR_HANDLE(descriptor_heap->GetCPUDescriptorHandleForHeapStart()).Offset(1, m_descriptor_stride_srv_cbv_uav)); - - // Convert - get_current_resource_storage().command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(std::get<1>(m_rtts.m_bound_depth_stencil), D3D12_RESOURCE_STATE_DEPTH_WRITE, D3D12_RESOURCE_STATE_GENERIC_READ)); - - get_current_resource_storage().command_list->SetPipelineState(m_convert_pso); - get_current_resource_storage().command_list->SetComputeRootSignature(m_convert_root_signature); - get_current_resource_storage().command_list->SetDescriptorHeaps(1, descriptor_heap.GetAddressOf()); - get_current_resource_storage().command_list->SetComputeRootDescriptorTable(0, descriptor_heap->GetGPUDescriptorHandleForHeapStart()); - get_current_resource_storage().command_list->Dispatch(clip_w / 8, clip_h / 8, 1); - - D3D12_RESOURCE_BARRIER barriers[] = - { - CD3DX12_RESOURCE_BARRIER::Transition(std::get<1>(m_rtts.m_bound_depth_stencil), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_DEPTH_WRITE), - CD3DX12_RESOURCE_BARRIER::UAV(depth_format_conversion_buffer.Get()), - }; - get_current_resource_storage().command_list->ResourceBarrier(2, barriers); - get_current_resource_storage().command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(depth_format_conversion_buffer.Get(), D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE)); - get_current_resource_storage().command_list->CopyTextureRegion(&CD3DX12_TEXTURE_COPY_LOCATION(m_readback_resources.get_heap(), { depth_buffer_offset_in_heap,{ DXGI_FORMAT_R8_UNORM, (UINT)clip_w, (UINT)clip_h, 1, (UINT)depth_row_pitch } }), 0, 0, 0, - &CD3DX12_TEXTURE_COPY_LOCATION(depth_format_conversion_buffer.Get(), 0), nullptr); - + get_current_resource_storage().command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(std::get<1>(m_rtts.m_bound_depth_stencil), D3D12_RESOURCE_STATE_DEPTH_WRITE, D3D12_RESOURCE_STATE_COPY_SOURCE)); + get_current_resource_storage().command_list->CopyTextureRegion(&CD3DX12_TEXTURE_COPY_LOCATION(m_readback_resources.get_heap(), { depth_buffer_offset_in_heap,{ DXGI_FORMAT_R32_TYPELESS, (UINT)clip_w, (UINT)clip_h, 1, (UINT)depth_row_pitch } }), 0, 0, 0, + &CD3DX12_TEXTURE_COPY_LOCATION(std::get<1>(m_rtts.m_bound_depth_stencil), 0), nullptr); + get_current_resource_storage().command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(std::get<1>(m_rtts.m_bound_depth_stencil), D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_DEPTH_WRITE)); invalidate_address(address_z); need_transfer = true; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Utils.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Utils.cpp index bc506139ec..e6cd73157a 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Utils.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Utils.cpp @@ -8,45 +8,6 @@ extern PFN_D3D12_SERIALIZE_ROOT_SIGNATURE wrapD3D12SerializeRootSignature; extern pD3DCompile wrapD3DCompile; - /** - * returns bytecode and root signature of a Compute Shader converting texture from - * one format to another - */ -static -std::pair compileF32toU8CS() -{ - const char *shaderCode = STRINGIFY( - Texture2D InputTexture : register(t0); \n - RWTexture2D OutputTexture : register(u0);\n - - [numthreads(8, 8, 1)]\n - void main(uint3 Id : SV_DispatchThreadID)\n - { \n - OutputTexture[Id.xy] = InputTexture.Load(uint3(Id.xy, 0));\n - } - ); - - ID3DBlob *bytecode; - Microsoft::WRL::ComPtr errorBlob; - CHECK_HRESULT(wrapD3DCompile(shaderCode, strlen(shaderCode), "test", nullptr, nullptr, "main", "cs_5_0", 0, 0, &bytecode, errorBlob.GetAddressOf())); - CD3DX12_DESCRIPTOR_RANGE descriptorRange[] = - { - // Textures - CD3DX12_DESCRIPTOR_RANGE(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 0), - // UAV (same descriptor heap) - CD3DX12_DESCRIPTOR_RANGE(D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 1, 0, 0, 1), - }; - - CD3DX12_ROOT_PARAMETER RP; - RP.InitAsDescriptorTable(2, &descriptorRange[0]); - - ID3DBlob *rootSignatureBlob; - - CHECK_HRESULT(wrapD3D12SerializeRootSignature(&CD3DX12_ROOT_SIGNATURE_DESC(1, &RP), D3D_ROOT_SIGNATURE_VERSION_1, &rootSignatureBlob, &errorBlob)); - return std::make_pair(bytecode, rootSignatureBlob); -} - - void D3D12GSRender::shader::init(ID3D12Device *device, ID3D12CommandQueue *gfx_command_queue) { const char *fsCode = STRINGIFY( @@ -213,25 +174,4 @@ void D3D12GSRender::shader::init(ID3D12Device *device, ID3D12CommandQueue *gfx_c WaitForSingleObjectEx(handle, INFINITE, FALSE); CloseHandle(handle); } - -void D3D12GSRender::init_convert_shader() -{ - const auto &p = compileF32toU8CS(); - CHECK_HRESULT( - m_device->CreateRootSignature(0, p.second->GetBufferPointer(), p.second->GetBufferSize(), IID_PPV_ARGS(&m_convert_root_signature)) - ); - - D3D12_COMPUTE_PIPELINE_STATE_DESC computePipelineStateDesc = {}; - computePipelineStateDesc.CS.BytecodeLength = p.first->GetBufferSize(); - computePipelineStateDesc.CS.pShaderBytecode = p.first->GetBufferPointer(); - computePipelineStateDesc.pRootSignature = m_convert_root_signature; - - CHECK_HRESULT( - m_device->CreateComputePipelineState(&computePipelineStateDesc, IID_PPV_ARGS(&m_convert_pso)) - ); - - p.first->Release(); - p.second->Release(); -} - #endif