[D3D12] DXBC STAT writing

This commit is contained in:
Triang3l 2018-08-30 14:42:17 +03:00
parent 501bec8e5e
commit c6e0c66c44
2 changed files with 63 additions and 0 deletions

View File

@ -32,6 +32,8 @@ void DxbcShaderTranslator::Reset() {
rdef_constants_used_ = 0;
writes_depth_ = false;
std::memset(&stat_, 0, sizeof(stat_));
}
std::vector<uint8_t> DxbcShaderTranslator::CompleteTranslation() {
@ -85,6 +87,18 @@ std::vector<uint8_t> 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));

View File

@ -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