From c6e0c66c44c4a228752e8f98627ab63491860ea3 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Thu, 30 Aug 2018 14:42:17 +0300 Subject: [PATCH] [D3D12] DXBC STAT writing --- src/xenia/gpu/dxbc_shader_translator.cc | 14 +++++++ src/xenia/gpu/dxbc_shader_translator.h | 49 +++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/xenia/gpu/dxbc_shader_translator.cc b/src/xenia/gpu/dxbc_shader_translator.cc index e3bf88e8f..c555aa7e8 100644 --- a/src/xenia/gpu/dxbc_shader_translator.cc +++ b/src/xenia/gpu/dxbc_shader_translator.cc @@ -32,6 +32,8 @@ void DxbcShaderTranslator::Reset() { rdef_constants_used_ = 0; writes_depth_ = false; + + std::memset(&stat_, 0, sizeof(stat_)); } std::vector DxbcShaderTranslator::CompleteTranslation() { @@ -85,6 +87,18 @@ std::vector DxbcShaderTranslator::CompleteTranslation() { (uint32_t(shader_object_.size()) - chunk_position_dwords - 2) * sizeof(uint32_t); + // TODO(Triang3l): Write SHEX. + + // Write STATistics. + chunk_position_dwords = uint32_t(shader_object_.size()); + shader_object_[12] = chunk_position_dwords * sizeof(uint32_t); + shader_object_.push_back('TATS'); + shader_object_.push_back(sizeof(stat_)); + shader_object_.resize(shader_object_.size() + + sizeof(stat_) / sizeof(uint32_t)); + std::memcpy(&shader_object_[chunk_position_dwords + 2], &stat_, + sizeof(stat_)); + // Fill the remaining fields of the header and copy bytes out. uint32_t shader_object_size = uint32_t(shader_object_.size() * sizeof(uint32_t)); diff --git a/src/xenia/gpu/dxbc_shader_translator.h b/src/xenia/gpu/dxbc_shader_translator.h index 3562b0184..db1e156d3 100644 --- a/src/xenia/gpu/dxbc_shader_translator.h +++ b/src/xenia/gpu/dxbc_shader_translator.h @@ -217,6 +217,55 @@ class DxbcShaderTranslator : public ShaderTranslator { rdef_constant_buffers_[size_t(RdefConstantBufferIndex::kCount)]; bool writes_depth_; + + // The STAT chunk (based on Wine d3dcompiler_parse_stat). + struct Statistics { + uint32_t instruction_count; + uint32_t temp_register_count; + // Unknown in Wine. + uint32_t def_count; + uint32_t dcl_count; + uint32_t float_instruction_count; + uint32_t int_instruction_count; + uint32_t uint_instruction_count; + uint32_t static_flow_control_count; + uint32_t dynamic_flow_control_count; + // Unknown in Wine. + uint32_t macro_instruction_count; + uint32_t temp_array_count; + uint32_t array_instruction_count; + uint32_t cut_instruction_count; + uint32_t emit_instruction_count; + uint32_t texture_normal_instructions; + uint32_t texture_load_instructions; + uint32_t texture_comp_instructions; + uint32_t texture_bias_instructions; + uint32_t texture_gradient_instructions; + uint32_t mov_instruction_count; + // Unknown in Wine. + uint32_t movc_instruction_count; + uint32_t conversion_instruction_count; + // Unknown in Wine. + uint32_t unknown_22; + uint32_t input_primitive; + uint32_t gs_output_topology; + uint32_t gs_max_output_vertex_count; + uint32_t unknown_26; + uint32_t unknown_27; + uint32_t unknown_28; + uint32_t unknown_29; + uint32_t c_control_points; + uint32_t hs_output_primitive; + uint32_t hs_partitioning; + uint32_t tessellator_domain; + // Unknown in Wine. + uint32_t c_barrier_instructions; + // Unknown in Wine. + uint32_t c_interlocked_instructions; + // Unknown in Wine. + uint32_t c_texture_store_instructions; + }; + Statistics stat_; }; } // namespace gpu