diff --git a/src/xenia/gpu/dxbc_shader_translator.cc b/src/xenia/gpu/dxbc_shader_translator.cc new file mode 100644 index 000000000..cbddd8e48 --- /dev/null +++ b/src/xenia/gpu/dxbc_shader_translator.cc @@ -0,0 +1,55 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2018 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/gpu/dxbc_shader_translator.h" + +#include + +#include "third_party/dxbc/DXBCChecksum.h" +#include "third_party/dxbc/d3d12TokenizedProgramFormat.hpp" + +namespace xe { +namespace gpu { +using namespace ucode; + +DxbcShaderTranslator::DxbcShaderTranslator() {} +DxbcShaderTranslator::~DxbcShaderTranslator() = default; + +void DxbcShaderTranslator::Reset() { + ShaderTranslator::Reset(); + + shader_code_.clear(); +} + +std::vector DxbcShaderTranslator::CompleteTranslation() { + shader_object_.clear(); + + // Shader object header. + shader_object_.push_back('CBXD'); + // Reserve space for the checksum. + for (uint32_t i = 0; i < 4; ++i) { + shader_object_.push_back(0); + } + shader_object_.push_back(1); + // Reserve space for the size. + shader_object_.push_back(0); + // 5 chunks - RDEF, ISGN, OSGN, SHEX, STAT. + shader_object_.push_back(5); + + // Copy bytes out. + // TODO(Triang3l): avoid copy? + std::vector shader_object_bytes; + shader_object_bytes.resize(shader_object_.size() * sizeof(uint32_t)); + std::memcpy(shader_object_bytes.data(), shader_object_.data(), + shader_object_bytes.size()); + return shader_object_bytes; +} + +} // namespace gpu +} // namespace xe diff --git a/src/xenia/gpu/dxbc_shader_translator.h b/src/xenia/gpu/dxbc_shader_translator.h new file mode 100644 index 000000000..5f8f144c8 --- /dev/null +++ b/src/xenia/gpu/dxbc_shader_translator.h @@ -0,0 +1,42 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2018 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_GPU_DXBC_SHADER_TRANSLATOR_H_ +#define XENIA_GPU_DXBC_SHADER_TRANSLATOR_H_ + +#include + +#include "xenia/gpu/shader_translator.h" + +namespace xe { +namespace gpu { + +// Generates shader model 5_1 byte code (for Direct3D 12). +class DxbcShaderTranslator : public ShaderTranslator { + public: + DxbcShaderTranslator(); + ~DxbcShaderTranslator() override; + + protected: + void Reset() override; + + std::vector CompleteTranslation() override; + + private: + // Executable instructions - generated during translation. + std::vector shader_code_; + // Complete shader object, with all the needed chunks and dcl_ instructions - + // generated in the end of translation. + std::vector shader_object_; +}; + +} // namespace gpu +} // namespace xe + +#endif // XENIA_GPU_DXBC_SHADER_TRANSLATOR_H_