From 58c104e0cc9bd99f8ea269fc0944e1e07707c983 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Wed, 15 Apr 2020 23:53:37 +0300 Subject: [PATCH] [DXBC] SRV binding enum --- .../gpu/d3d12/d3d12_command_processor.cc | 16 +++-- src/xenia/gpu/d3d12/d3d12_command_processor.h | 3 +- src/xenia/gpu/dxbc_shader_translator.cc | 30 +++++----- src/xenia/gpu/dxbc_shader_translator.h | 18 +++++- src/xenia/gpu/dxbc_shader_translator_fetch.cc | 59 +++++++++++-------- 5 files changed, 74 insertions(+), 52 deletions(-) diff --git a/src/xenia/gpu/d3d12/d3d12_command_processor.cc b/src/xenia/gpu/d3d12/d3d12_command_processor.cc index cff1532df..1575173c8 100644 --- a/src/xenia/gpu/d3d12/d3d12_command_processor.cc +++ b/src/xenia/gpu/d3d12/d3d12_command_processor.cc @@ -312,8 +312,10 @@ ID3D12RootSignature* D3D12CommandProcessor::GetRootSignature( shared_memory_and_edram_ranges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV; shared_memory_and_edram_ranges[0].NumDescriptors = 1; - shared_memory_and_edram_ranges[0].BaseShaderRegister = 0; - shared_memory_and_edram_ranges[0].RegisterSpace = 0; + shared_memory_and_edram_ranges[0].BaseShaderRegister = + uint32_t(DxbcShaderTranslator::SRVMainRegister::kSharedMemory); + shared_memory_and_edram_ranges[0].RegisterSpace = + uint32_t(DxbcShaderTranslator::SRVSpace::kMain); shared_memory_and_edram_ranges[0].OffsetInDescriptorsFromTableStart = 0; shared_memory_and_edram_ranges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV; @@ -346,8 +348,9 @@ ID3D12RootSignature* D3D12CommandProcessor::GetRootSignature( parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL; range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV; range.NumDescriptors = texture_count_pixel; - range.BaseShaderRegister = 1; - range.RegisterSpace = 0; + range.BaseShaderRegister = + uint32_t(DxbcShaderTranslator::SRVMainRegister::kBoundTexturesStart); + range.RegisterSpace = uint32_t(DxbcShaderTranslator::SRVSpace::kMain); range.OffsetInDescriptorsFromTableStart = 0; ++desc.NumParameters; } @@ -378,8 +381,9 @@ ID3D12RootSignature* D3D12CommandProcessor::GetRootSignature( parameter.ShaderVisibility = vertex_visibility; range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV; range.NumDescriptors = texture_count_vertex; - range.BaseShaderRegister = 1; - range.RegisterSpace = 0; + range.BaseShaderRegister = + uint32_t(DxbcShaderTranslator::SRVMainRegister::kBoundTexturesStart); + range.RegisterSpace = uint32_t(DxbcShaderTranslator::SRVSpace::kMain); range.OffsetInDescriptorsFromTableStart = 0; ++desc.NumParameters; } diff --git a/src/xenia/gpu/d3d12/d3d12_command_processor.h b/src/xenia/gpu/d3d12/d3d12_command_processor.h index bdb5674e1..700eef161 100644 --- a/src/xenia/gpu/d3d12/d3d12_command_processor.h +++ b/src/xenia/gpu/d3d12/d3d12_command_processor.h @@ -195,8 +195,7 @@ class D3D12CommandProcessor : public CommandProcessor { // Pretty rarely used and rarely changed - flow control constants. kRootParameter_BoolLoopConstants, // Never changed except for when starting a new descriptor heap - shared - // memory byte address buffer (t0) and, if ROV is used for EDRAM, EDRAM UAV - // (u0). + // memory byte address buffer, and, if ROV is used for EDRAM, EDRAM UAV. kRootParameter_SharedMemoryAndEDRAM, kRootParameter_Count_Base, diff --git a/src/xenia/gpu/dxbc_shader_translator.cc b/src/xenia/gpu/dxbc_shader_translator.cc index 86748e03d..79185d0fd 100644 --- a/src/xenia/gpu/dxbc_shader_translator.cc +++ b/src/xenia/gpu/dxbc_shader_translator.cc @@ -3481,14 +3481,12 @@ void DxbcShaderTranslator::WriteResourceDefinitions() { shader_object_.push_back(uint32_t(DxbcRdefDimension::kSRVBuffer)); // Multisampling not applicable. shader_object_.push_back(0); - // Register t0. - shader_object_.push_back(0); + shader_object_.push_back(uint32_t(SRVMainRegister::kSharedMemory)); // One binding. shader_object_.push_back(1); // No DxbcRdefInputFlags. shader_object_.push_back(0); - // Register space 0. - shader_object_.push_back(0); + shader_object_.push_back(uint32_t(SRVSpace::kMain)); // SRV ID T0. shader_object_.push_back(0); @@ -3511,14 +3509,13 @@ void DxbcShaderTranslator::WriteResourceDefinitions() { } // Not multisampled. shader_object_.push_back(0xFFFFFFFFu); - // Register t[1 + i] - t0 is shared memory. - shader_object_.push_back(1 + i); + shader_object_.push_back(uint32_t(SRVMainRegister::kBoundTexturesStart) + + i); // One binding. shader_object_.push_back(1); // 4-component. shader_object_.push_back(DxbcRdefInputFlagsComponents); - // Register space 0. - shader_object_.push_back(0); + shader_object_.push_back(uint32_t(SRVSpace::kMain)); // SRV ID T[1 + i] - T0 is shared memory. shader_object_.push_back(1 + i); texture_name_offset += GetStringLength(texture_srv.name.c_str()); @@ -4326,16 +4323,16 @@ void DxbcShaderTranslator::WriteShaderCode() { } // Shader resources. - // Shared memory ByteAddressBuffer (T0, at t0, space0). + // Shared memory ByteAddressBuffer. shader_object_.push_back( ENCODE_D3D10_SB_OPCODE_TYPE(D3D11_SB_OPCODE_DCL_RESOURCE_RAW) | ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(6)); shader_object_.push_back(EncodeVectorSwizzledOperand( D3D10_SB_OPERAND_TYPE_RESOURCE, kSwizzleXYZW, 3)); shader_object_.push_back(0); - shader_object_.push_back(0); - shader_object_.push_back(0); - shader_object_.push_back(0); + shader_object_.push_back(uint32_t(SRVMainRegister::kSharedMemory)); + shader_object_.push_back(uint32_t(SRVMainRegister::kSharedMemory)); + shader_object_.push_back(uint32_t(SRVSpace::kMain)); // Textures. for (uint32_t i = 0; i < uint32_t(texture_srvs_.size()); ++i) { const TextureSRV& texture_srv = texture_srvs_[i]; @@ -4358,15 +4355,16 @@ void DxbcShaderTranslator::WriteShaderCode() { D3D10_SB_OPERAND_TYPE_RESOURCE, kSwizzleXYZW, 3)); // T0 is shared memory. shader_object_.push_back(1 + i); - // t0 is shared memory. - shader_object_.push_back(1 + i); - shader_object_.push_back(1 + i); + shader_object_.push_back(uint32_t(SRVMainRegister::kBoundTexturesStart) + + i); + shader_object_.push_back(uint32_t(SRVMainRegister::kBoundTexturesStart) + + i); shader_object_.push_back( ENCODE_D3D10_SB_RESOURCE_RETURN_TYPE(D3D10_SB_RETURN_TYPE_FLOAT, 0) | ENCODE_D3D10_SB_RESOURCE_RETURN_TYPE(D3D10_SB_RETURN_TYPE_FLOAT, 1) | ENCODE_D3D10_SB_RESOURCE_RETURN_TYPE(D3D10_SB_RETURN_TYPE_FLOAT, 2) | ENCODE_D3D10_SB_RESOURCE_RETURN_TYPE(D3D10_SB_RETURN_TYPE_FLOAT, 3)); - shader_object_.push_back(0); + shader_object_.push_back(uint32_t(SRVSpace::kMain)); } } diff --git a/src/xenia/gpu/dxbc_shader_translator.h b/src/xenia/gpu/dxbc_shader_translator.h index 0ba5b5244..49fb2b11d 100644 --- a/src/xenia/gpu/dxbc_shader_translator.h +++ b/src/xenia/gpu/dxbc_shader_translator.h @@ -321,6 +321,18 @@ class DxbcShaderTranslator : public ShaderTranslator { float edram_blend_constant[4]; }; + // Shader resource view binding spaces. + enum class SRVSpace { + // SRVMainSpaceRegister t# layout. + kMain, + }; + + // Shader resource view bindings in SRVSpace::kMain. + enum class SRVMainRegister { + kSharedMemory, + kBoundTexturesStart, + }; + // 192 textures at most because there are 32 fetch constants, and textures can // be 2D array, 3D or cube, and also signed and unsigned. static constexpr uint32_t kMaxTextureSRVIndexBits = 8; @@ -335,7 +347,8 @@ class DxbcShaderTranslator : public ShaderTranslator { bool is_sign_required; std::string name; }; - // The first binding returned is at t1 because t0 is shared memory. + // The first binding returned is at t[SRVMainRegister::kBoundTexturesStart] + // of space SRVSpace::kMain. const TextureSRV* GetTextureSRVs(uint32_t& count_out) const { count_out = uint32_t(texture_srvs_.size()); return texture_srvs_.data(); @@ -2081,7 +2094,8 @@ class DxbcShaderTranslator : public ShaderTranslator { // Emits copde for endian swapping of the data located in pv. void SwapVertexData(uint32_t vfetch_index, uint32_t write_mask); - // Returns T#/t# index (they are the same in this translator). + // Returns index in texture_srvs_, and, for bound textures, it's also relative + // to the base T#/t# index of textures. uint32_t FindOrAddTextureSRV(uint32_t fetch_constant, TextureDimension dimension, bool is_signed, bool is_sign_required = false); diff --git a/src/xenia/gpu/dxbc_shader_translator_fetch.cc b/src/xenia/gpu/dxbc_shader_translator_fetch.cc index c7d7854e1..6d043a49b 100644 --- a/src/xenia/gpu/dxbc_shader_translator_fetch.cc +++ b/src/xenia/gpu/dxbc_shader_translator_fetch.cc @@ -501,7 +501,7 @@ void DxbcShaderTranslator::ProcessVertexFetchInstruction( D3D10_SB_OPERAND_TYPE_RESOURCE, kSwizzleXYZW & ((1 << (load_dword_count * 2)) - 1), 2)); shader_code_.push_back(0); - shader_code_.push_back(0); + shader_code_.push_back(uint32_t(SRVMainRegister::kSharedMemory)); ++stat_.instruction_count; ++stat_.texture_load_instructions; @@ -756,7 +756,6 @@ uint32_t DxbcShaderTranslator::FindOrAddTextureSRV(uint32_t fetch_constant, if (dimension == TextureDimension::k1D) { dimension = TextureDimension::k2D; } - // 1 is added to the return value because T0/t0 is shared memory. for (uint32_t i = 0; i < uint32_t(texture_srvs_.size()); ++i) { TextureSRV& texture_srv = texture_srvs_[i]; if (texture_srv.fetch_constant == fetch_constant && @@ -767,12 +766,12 @@ uint32_t DxbcShaderTranslator::FindOrAddTextureSRV(uint32_t fetch_constant, // must be bound even when all components are signed. texture_srv.is_sign_required = true; } - return 1 + i; + return i; } } if (texture_srvs_.size() >= kMaxTextureSRVs) { assert_always(); - return 1 + (kMaxTextureSRVs - 1); + return kMaxTextureSRVs - 1; } TextureSRV new_texture_srv; new_texture_srv.fetch_constant = fetch_constant; @@ -792,9 +791,9 @@ uint32_t DxbcShaderTranslator::FindOrAddTextureSRV(uint32_t fetch_constant, } new_texture_srv.name = fmt::format("xe_texture{}_{}_{}", fetch_constant, dimension_name, is_signed ? 's' : 'u'); - uint32_t srv_register = 1 + uint32_t(texture_srvs_.size()); + uint32_t srv_index = uint32_t(texture_srvs_.size()); texture_srvs_.emplace_back(std::move(new_texture_srv)); - return srv_register; + return srv_index; } uint32_t DxbcShaderTranslator::FindOrAddSamplerBinding( @@ -1277,8 +1276,8 @@ void DxbcShaderTranslator::ProcessTextureFetchInstruction( store_result = true; // 0 is unsigned, 1 is signed. - uint32_t srv_registers[2] = {UINT32_MAX, UINT32_MAX}; - uint32_t srv_registers_stacked[2] = {UINT32_MAX, UINT32_MAX}; + uint32_t srv_indices[2] = {UINT32_MAX, UINT32_MAX}; + uint32_t srv_indices_stacked[2] = {UINT32_MAX, UINT32_MAX}; uint32_t sampler_register = UINT32_MAX; // Only the fetch constant needed for kGetTextureWeights. if (instr.opcode != FetchOpcode::kGetTextureWeights) { @@ -1286,23 +1285,23 @@ void DxbcShaderTranslator::ProcessTextureFetchInstruction( // The LOD is a scalar and it doesn't depend on the texture contents, so // require any variant - unsigned in this case because more texture // formats support it. - srv_registers[0] = + srv_indices[0] = FindOrAddTextureSRV(tfetch_index, instr.dimension, false, true); if (instr.dimension == TextureDimension::k3D) { // 3D or 2D stacked is selected dynamically. - srv_registers_stacked[0] = FindOrAddTextureSRV( + srv_indices_stacked[0] = FindOrAddTextureSRV( tfetch_index, TextureDimension::k2D, false, true); } } else { - srv_registers[0] = + srv_indices[0] = FindOrAddTextureSRV(tfetch_index, instr.dimension, false); - srv_registers[1] = + srv_indices[1] = FindOrAddTextureSRV(tfetch_index, instr.dimension, true); if (instr.dimension == TextureDimension::k3D) { // 3D or 2D stacked is selected dynamically. - srv_registers_stacked[0] = + srv_indices_stacked[0] = FindOrAddTextureSRV(tfetch_index, TextureDimension::k2D, false); - srv_registers_stacked[1] = + srv_indices_stacked[1] = FindOrAddTextureSRV(tfetch_index, TextureDimension::k2D, true); } } @@ -2297,8 +2296,8 @@ void DxbcShaderTranslator::ProcessTextureFetchInstruction( // The non-pixel-shader case should be handled before because it // just returns a constant in this case. assert_true(IsDxbcPixelShader()); - uint32_t srv_register_current = - i ? srv_registers_stacked[0] : srv_registers[0]; + uint32_t srv_index_current = + i ? srv_indices_stacked[0] : srv_indices[0]; replicate_result = true; shader_code_.push_back( ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_1_SB_OPCODE_LOD) | @@ -2311,8 +2310,10 @@ void DxbcShaderTranslator::ProcessTextureFetchInstruction( shader_code_.push_back(coord_temp); shader_code_.push_back(EncodeVectorSwizzledOperand( D3D10_SB_OPERAND_TYPE_RESOURCE, kSwizzleXYZW, 2)); - shader_code_.push_back(srv_register_current); - shader_code_.push_back(srv_register_current); + shader_code_.push_back(1 + srv_index_current); + shader_code_.push_back( + uint32_t(SRVMainRegister::kBoundTexturesStart) + + srv_index_current); shader_code_.push_back( EncodeZeroComponentOperand(D3D10_SB_OPERAND_TYPE_SAMPLER, 2)); shader_code_.push_back(sampler_register); @@ -2341,8 +2342,8 @@ void DxbcShaderTranslator::ProcessTextureFetchInstruction( // Sample both unsigned and signed, and for stacked textures, two // samples if filtering is needed. for (uint32_t j = 0; j < 2; ++j) { - uint32_t srv_register_current = - i ? srv_registers_stacked[j] : srv_registers[j]; + uint32_t srv_index_current = + i ? srv_indices_stacked[j] : srv_indices[j]; uint32_t target_temp_sign = j ? signed_value_temp : system_temp_pv_; for (uint32_t k = 0; k < (vol_filter_lerp_temp != UINT32_MAX ? 2u : 1u); ++k) { @@ -2392,8 +2393,10 @@ void DxbcShaderTranslator::ProcessTextureFetchInstruction( shader_code_.push_back(coord_temp); shader_code_.push_back(EncodeVectorSwizzledOperand( D3D10_SB_OPERAND_TYPE_RESOURCE, kSwizzleXYZW, 2)); - shader_code_.push_back(srv_register_current); - shader_code_.push_back(srv_register_current); + shader_code_.push_back(1 + srv_index_current); + shader_code_.push_back( + uint32_t(SRVMainRegister::kBoundTexturesStart) + + srv_index_current); shader_code_.push_back(EncodeZeroComponentOperand( D3D10_SB_OPERAND_TYPE_SAMPLER, 2)); shader_code_.push_back(sampler_register); @@ -2419,8 +2422,10 @@ void DxbcShaderTranslator::ProcessTextureFetchInstruction( shader_code_.push_back(coord_temp); shader_code_.push_back(EncodeVectorSwizzledOperand( D3D10_SB_OPERAND_TYPE_RESOURCE, kSwizzleXYZW, 2)); - shader_code_.push_back(srv_register_current); - shader_code_.push_back(srv_register_current); + shader_code_.push_back(1 + srv_index_current); + shader_code_.push_back( + uint32_t(SRVMainRegister::kBoundTexturesStart) + + srv_index_current); shader_code_.push_back(EncodeZeroComponentOperand( D3D10_SB_OPERAND_TYPE_SAMPLER, 2)); shader_code_.push_back(sampler_register); @@ -2466,8 +2471,10 @@ void DxbcShaderTranslator::ProcessTextureFetchInstruction( shader_code_.push_back(coord_temp); shader_code_.push_back(EncodeVectorSwizzledOperand( D3D10_SB_OPERAND_TYPE_RESOURCE, kSwizzleXYZW, 2)); - shader_code_.push_back(srv_register_current); - shader_code_.push_back(srv_register_current); + shader_code_.push_back(1 + srv_index_current); + shader_code_.push_back( + uint32_t(SRVMainRegister::kBoundTexturesStart) + + srv_index_current); shader_code_.push_back(EncodeZeroComponentOperand( D3D10_SB_OPERAND_TYPE_SAMPLER, 2)); shader_code_.push_back(sampler_register);