[GPU] Dynamic r# count via shader modifications + refactoring
This commit is contained in:
@@ -364,10 +364,11 @@ VkPipeline PipelineCache::GetPipeline(const RenderState* render_state,
|
||||
}
|
||||
|
||||
bool PipelineCache::TranslateShader(
|
||||
VulkanShader::VulkanTranslation& translation, reg::SQ_PROGRAM_CNTL cntl) {
|
||||
VulkanShader::VulkanTranslation& translation) {
|
||||
translation.shader().AnalyzeUcode(ucode_disasm_buffer_);
|
||||
// Perform translation.
|
||||
// If this fails the shader will be marked as invalid and ignored later.
|
||||
if (!shader_translator_->Translate(translation, cntl)) {
|
||||
if (!shader_translator_->TranslateAnalyzedShader(translation)) {
|
||||
XELOGE("Shader translation failed; marking shader as ignored");
|
||||
return false;
|
||||
}
|
||||
@@ -1071,9 +1072,11 @@ PipelineCache::UpdateStatus PipelineCache::UpdateShaderStages(
|
||||
static_cast<VulkanShader::VulkanTranslation*>(
|
||||
vertex_shader->GetOrCreateTranslation(
|
||||
shader_translator_->GetDefaultModification(
|
||||
xenos::ShaderType::kVertex)));
|
||||
xenos::ShaderType::kVertex,
|
||||
vertex_shader->GetDynamicAddressableRegisterCount(
|
||||
regs.sq_program_cntl.vs_num_reg))));
|
||||
if (!vertex_shader_translation->is_translated() &&
|
||||
!TranslateShader(*vertex_shader_translation, regs.sq_program_cntl)) {
|
||||
!TranslateShader(*vertex_shader_translation)) {
|
||||
XELOGE("Failed to translate the vertex shader!");
|
||||
return UpdateStatus::kError;
|
||||
}
|
||||
@@ -1083,9 +1086,11 @@ PipelineCache::UpdateStatus PipelineCache::UpdateShaderStages(
|
||||
pixel_shader_translation = static_cast<VulkanShader::VulkanTranslation*>(
|
||||
pixel_shader->GetOrCreateTranslation(
|
||||
shader_translator_->GetDefaultModification(
|
||||
xenos::ShaderType::kPixel)));
|
||||
xenos::ShaderType::kPixel,
|
||||
pixel_shader->GetDynamicAddressableRegisterCount(
|
||||
regs.sq_program_cntl.ps_num_reg))));
|
||||
if (!pixel_shader_translation->is_translated() &&
|
||||
!TranslateShader(*pixel_shader_translation, regs.sq_program_cntl)) {
|
||||
!TranslateShader(*pixel_shader_translation)) {
|
||||
XELOGE("Failed to translate the pixel shader!");
|
||||
return UpdateStatus::kError;
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
#include "xenia/base/string_buffer.h"
|
||||
#include "xenia/base/xxhash.h"
|
||||
#include "xenia/gpu/register_file.h"
|
||||
#include "xenia/gpu/spirv_shader_translator.h"
|
||||
@@ -78,8 +79,7 @@ class PipelineCache {
|
||||
// state.
|
||||
VkPipeline GetPipeline(const RenderState* render_state, uint64_t hash_key);
|
||||
|
||||
bool TranslateShader(VulkanShader::VulkanTranslation& translation,
|
||||
reg::SQ_PROGRAM_CNTL cntl);
|
||||
bool TranslateShader(VulkanShader::VulkanTranslation& translation);
|
||||
|
||||
void DumpShaderDisasmAMD(VkPipeline pipeline);
|
||||
void DumpShaderDisasmNV(const VkGraphicsPipelineCreateInfo& info);
|
||||
@@ -92,6 +92,8 @@ class PipelineCache {
|
||||
RegisterFile* register_file_ = nullptr;
|
||||
ui::vulkan::VulkanDevice* device_ = nullptr;
|
||||
|
||||
// Temporary storage for AnalyzeUcode calls.
|
||||
StringBuffer ucode_disasm_buffer_;
|
||||
// Reusable shader translator.
|
||||
std::unique_ptr<ShaderTranslator> shader_translator_ = nullptr;
|
||||
// Disassembler used to get the SPIRV disasm. Only used in debug.
|
||||
|
||||
@@ -73,7 +73,7 @@ bool VulkanShader::VulkanTranslation::Prepare() {
|
||||
}
|
||||
|
||||
Shader::Translation* VulkanShader::CreateTranslationInstance(
|
||||
uint32_t modification) {
|
||||
uint64_t modification) {
|
||||
return new VulkanTranslation(*this, modification);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ class VulkanShader : public Shader {
|
||||
public:
|
||||
class VulkanTranslation : public Translation {
|
||||
public:
|
||||
VulkanTranslation(VulkanShader& shader, uint32_t modification)
|
||||
VulkanTranslation(VulkanShader& shader, uint64_t modification)
|
||||
: Translation(shader, modification) {}
|
||||
~VulkanTranslation() override;
|
||||
|
||||
@@ -41,7 +41,7 @@ class VulkanShader : public Shader {
|
||||
uint32_t dword_count);
|
||||
|
||||
protected:
|
||||
Translation* CreateTranslationInstance(uint32_t modification) override;
|
||||
Translation* CreateTranslationInstance(uint64_t modification) override;
|
||||
|
||||
private:
|
||||
ui::vulkan::VulkanDevice* device_ = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user