Compare commits

..

1 Commits

Author SHA1 Message Date
GPUCode
ab2c559a2a shader_unit: Intialize temporaries on shader invocation 2024-01-19 20:55:56 +02:00
4 changed files with 11 additions and 23 deletions

View File

@@ -256,10 +256,6 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX(vs.bool_uniforms): case PICA_REG_INDEX(vs.bool_uniforms):
vs_setup.WriteUniformBoolReg(regs.internal.vs.bool_uniforms.Value()); vs_setup.WriteUniformBoolReg(regs.internal.vs.bool_uniforms.Value());
if (!regs.internal.pipeline.gs_unit_exclusive_configuration &&
regs.internal.pipeline.use_gs == PipelineRegs::UseGS::No) {
gs_setup.WriteUniformBoolReg(regs.internal.vs.bool_uniforms.Value());
}
break; break;
case PICA_REG_INDEX(vs.int_uniforms[0]): case PICA_REG_INDEX(vs.int_uniforms[0]):
@@ -268,10 +264,6 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX(vs.int_uniforms[3]): { case PICA_REG_INDEX(vs.int_uniforms[3]): {
const u32 index = (id - PICA_REG_INDEX(vs.int_uniforms[0])); const u32 index = (id - PICA_REG_INDEX(vs.int_uniforms[0]));
vs_setup.WriteUniformIntReg(index, regs.internal.vs.GetIntUniform(index)); vs_setup.WriteUniformIntReg(index, regs.internal.vs.GetIntUniform(index));
if (!regs.internal.pipeline.gs_unit_exclusive_configuration &&
regs.internal.pipeline.use_gs == PipelineRegs::UseGS::No) {
gs_setup.WriteUniformIntReg(index, regs.internal.vs.GetIntUniform(index));
}
break; break;
} }
@@ -283,11 +275,7 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask) {
case PICA_REG_INDEX(vs.uniform_setup.set_value[5]): case PICA_REG_INDEX(vs.uniform_setup.set_value[5]):
case PICA_REG_INDEX(vs.uniform_setup.set_value[6]): case PICA_REG_INDEX(vs.uniform_setup.set_value[6]):
case PICA_REG_INDEX(vs.uniform_setup.set_value[7]): { case PICA_REG_INDEX(vs.uniform_setup.set_value[7]): {
const auto index = vs_setup.WriteUniformFloatReg(regs.internal.vs, value); vs_setup.WriteUniformFloatReg(regs.internal.vs, value);
if (!regs.internal.pipeline.gs_unit_exclusive_configuration &&
regs.internal.pipeline.use_gs == PipelineRegs::UseGS::No && index) {
gs_setup.uniforms.f[index.value()] = vs_setup.uniforms.f[index.value()];
}
break; break;
} }

View File

@@ -27,23 +27,21 @@ void ShaderSetup::WriteUniformIntReg(u32 index, const Common::Vec4<u8> values) {
uniforms.i[index] = values; uniforms.i[index] = values;
} }
std::optional<u32> ShaderSetup::WriteUniformFloatReg(ShaderRegs& config, u32 value) { void ShaderSetup::WriteUniformFloatReg(ShaderRegs& config, u32 value) {
auto& uniform_setup = config.uniform_setup; auto& uniform_setup = config.uniform_setup;
const bool is_float32 = uniform_setup.IsFloat32(); const bool is_float32 = uniform_setup.IsFloat32();
if (!uniform_queue.Push(value, is_float32)) { if (!uniform_queue.Push(value, is_float32)) {
return std::nullopt; return;
} }
const auto uniform = uniform_queue.Get(is_float32); const auto uniform = uniform_queue.Get(is_float32);
if (uniform_setup.index >= uniforms.f.size()) { if (uniform_setup.index >= uniforms.f.size()) {
LOG_ERROR(HW_GPU, "Invalid float uniform index {}", uniform_setup.index.Value()); LOG_ERROR(HW_GPU, "Invalid float uniform index {}", uniform_setup.index.Value());
return std::nullopt; return;
} }
const u32 index = uniform_setup.index.Value(); uniforms.f[uniform_setup.index] = uniform;
uniforms.f[index] = uniform; uniform_setup.index.Assign(uniform_setup.index + 1);
uniform_setup.index.Assign(index + 1);
return index;
} }
u64 ShaderSetup::GetProgramCodeHash() { u64 ShaderSetup::GetProgramCodeHash() {

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <optional>
#include "common/vector_math.h" #include "common/vector_math.h"
#include "video_core/pica/packed_attribute.h" #include "video_core/pica/packed_attribute.h"
#include "video_core/pica_types.h" #include "video_core/pica_types.h"
@@ -59,7 +58,7 @@ public:
void WriteUniformIntReg(u32 index, const Common::Vec4<u8> values); void WriteUniformIntReg(u32 index, const Common::Vec4<u8> values);
std::optional<u32> WriteUniformFloatReg(ShaderRegs& config, u32 value); void WriteUniformFloatReg(ShaderRegs& config, u32 value);
u64 GetProgramCodeHash(); u64 GetProgramCodeHash();

View File

@@ -9,7 +9,10 @@
namespace Pica { namespace Pica {
ShaderUnit::ShaderUnit(GeometryEmitter* emitter) : emitter_ptr{emitter} {} ShaderUnit::ShaderUnit(GeometryEmitter* emitter) : emitter_ptr{emitter} {
const Common::Vec4<f24> temp_vec{f24::Zero(), f24::Zero(), f24::Zero(), f24::One()};
temporary.fill(temp_vec);
}
ShaderUnit::~ShaderUnit() = default; ShaderUnit::~ShaderUnit() = default;