Compare commits
2 Commits
gs-uniform
...
gl-present
Author | SHA1 | Date | |
---|---|---|---|
|
208e1a0aaf | ||
|
1247bff174 |
@@ -256,10 +256,6 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask) {
|
||||
|
||||
case PICA_REG_INDEX(vs.bool_uniforms):
|
||||
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;
|
||||
|
||||
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]): {
|
||||
const u32 index = (id - PICA_REG_INDEX(vs.int_uniforms[0]));
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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[6]):
|
||||
case PICA_REG_INDEX(vs.uniform_setup.set_value[7]): {
|
||||
const auto index = 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()];
|
||||
}
|
||||
vs_setup.WriteUniformFloatReg(regs.internal.vs, value);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@@ -27,23 +27,21 @@ void ShaderSetup::WriteUniformIntReg(u32 index, const Common::Vec4<u8> 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;
|
||||
const bool is_float32 = uniform_setup.IsFloat32();
|
||||
if (!uniform_queue.Push(value, is_float32)) {
|
||||
return std::nullopt;
|
||||
return;
|
||||
}
|
||||
|
||||
const auto uniform = uniform_queue.Get(is_float32);
|
||||
if (uniform_setup.index >= uniforms.f.size()) {
|
||||
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[index] = uniform;
|
||||
uniform_setup.index.Assign(index + 1);
|
||||
return index;
|
||||
uniforms.f[uniform_setup.index] = uniform;
|
||||
uniform_setup.index.Assign(uniform_setup.index + 1);
|
||||
}
|
||||
|
||||
u64 ShaderSetup::GetProgramCodeHash() {
|
||||
|
@@ -4,7 +4,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <optional>
|
||||
#include "common/vector_math.h"
|
||||
#include "video_core/pica/packed_attribute.h"
|
||||
#include "video_core/pica_types.h"
|
||||
@@ -59,7 +58,7 @@ public:
|
||||
|
||||
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();
|
||||
|
||||
|
@@ -67,6 +67,16 @@ RasterizerCache<T>::RasterizerCache(Memory::MemorySystem& memory_,
|
||||
.wrap_s = TextureConfig::WrapMode::ClampToBorder,
|
||||
.wrap_t = TextureConfig::WrapMode::ClampToBorder,
|
||||
}));
|
||||
|
||||
auto& null_surface = slot_surfaces[NULL_SURFACE_ID];
|
||||
runtime.ClearTexture(null_surface, {
|
||||
.texture_level = 0,
|
||||
.texture_rect = null_surface.GetScaledRect(),
|
||||
.value =
|
||||
{
|
||||
.color = {0.f, 0.f, 0.f, 0.f},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
template <class T>
|
||||
|
@@ -63,7 +63,13 @@ static std::string GetVertexInterfaceDeclaration(bool is_output, bool use_clip_p
|
||||
if (is_output && separable_shader) {
|
||||
// gl_PerVertex redeclaration is required for separate shader object
|
||||
out += "out gl_PerVertex {\n";
|
||||
// Apple Silicon GPU drivers optimize more aggressively, which can create
|
||||
// too much variance and cause visual artifacting in games like Pokemon.
|
||||
#ifdef __APPLE__
|
||||
out += " invariant vec4 gl_Position;\n";
|
||||
#else
|
||||
out += " vec4 gl_Position;\n";
|
||||
#endif
|
||||
if (use_clip_planes) {
|
||||
out += " float gl_ClipDistance[2];\n";
|
||||
}
|
||||
|
Reference in New Issue
Block a user