gl_shader_decompiler: Remove guest "position" varying
"position" was being written but not read anywhere besides geometry shaders, where it had the same value as gl_Position. This commit replaces "position" with gl_Position, reducing the complexity of our code and the emitted GLSL code.
This commit is contained in:
parent
e70f16fff7
commit
0935c2d97b
|
@ -45,7 +45,6 @@ struct TextureAoffi {};
|
||||||
using TextureArgument = std::pair<Type, Node>;
|
using TextureArgument = std::pair<Type, Node>;
|
||||||
using TextureIR = std::variant<TextureAoffi, TextureArgument>;
|
using TextureIR = std::variant<TextureAoffi, TextureArgument>;
|
||||||
|
|
||||||
enum : u32 { POSITION_VARYING_LOCATION = 0, GENERIC_VARYING_START_LOCATION = 1 };
|
|
||||||
constexpr u32 MAX_CONSTBUFFER_ELEMENTS =
|
constexpr u32 MAX_CONSTBUFFER_ELEMENTS =
|
||||||
static_cast<u32>(RasterizerOpenGL::MaxConstbufferSize) / (4 * sizeof(float));
|
static_cast<u32>(RasterizerOpenGL::MaxConstbufferSize) / (4 * sizeof(float));
|
||||||
|
|
||||||
|
@ -247,6 +246,12 @@ private:
|
||||||
code.AddLine("layout ({}, max_vertices = {}) out;", topology, max_vertices);
|
code.AddLine("layout ({}, max_vertices = {}) out;", topology, max_vertices);
|
||||||
code.AddNewLine();
|
code.AddNewLine();
|
||||||
|
|
||||||
|
code.AddLine("in gl_PerVertex {{");
|
||||||
|
++code.scope;
|
||||||
|
code.AddLine("vec4 gl_Position;");
|
||||||
|
--code.scope;
|
||||||
|
code.AddLine("}} gl_in[];");
|
||||||
|
|
||||||
DeclareVertexRedeclarations();
|
DeclareVertexRedeclarations();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,7 +354,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeclareInputAttribute(Attribute::Index index, bool skip_unused) {
|
void DeclareInputAttribute(Attribute::Index index, bool skip_unused) {
|
||||||
const u32 generic_index{GetGenericAttributeIndex(index)};
|
const u32 location{GetGenericAttributeIndex(index)};
|
||||||
|
|
||||||
std::string name{GetInputAttribute(index)};
|
std::string name{GetInputAttribute(index)};
|
||||||
if (stage == ShaderStage::Geometry) {
|
if (stage == ShaderStage::Geometry) {
|
||||||
|
@ -358,19 +363,13 @@ private:
|
||||||
|
|
||||||
std::string suffix;
|
std::string suffix;
|
||||||
if (stage == ShaderStage::Fragment) {
|
if (stage == ShaderStage::Fragment) {
|
||||||
const auto input_mode{header.ps.GetAttributeUse(generic_index)};
|
const auto input_mode{header.ps.GetAttributeUse(location)};
|
||||||
if (skip_unused && input_mode == AttributeUse::Unused) {
|
if (skip_unused && input_mode == AttributeUse::Unused) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
suffix = GetInputFlags(input_mode);
|
suffix = GetInputFlags(input_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 location = generic_index;
|
|
||||||
if (stage != ShaderStage::Vertex) {
|
|
||||||
// If inputs are varyings, add an offset
|
|
||||||
location += GENERIC_VARYING_START_LOCATION;
|
|
||||||
}
|
|
||||||
|
|
||||||
code.AddLine("layout (location = {}) {} in vec4 {};", location, suffix, name);
|
code.AddLine("layout (location = {}) {} in vec4 {};", location, suffix, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -395,7 +394,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeclareOutputAttribute(Attribute::Index index) {
|
void DeclareOutputAttribute(Attribute::Index index) {
|
||||||
const u32 location{GetGenericAttributeIndex(index) + GENERIC_VARYING_START_LOCATION};
|
const u32 location{GetGenericAttributeIndex(index)};
|
||||||
code.AddLine("layout (location = {}) out vec4 {};", location, GetOutputAttribute(index));
|
code.AddLine("layout (location = {}) out vec4 {};", location, GetOutputAttribute(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -633,10 +632,14 @@ private:
|
||||||
|
|
||||||
switch (attribute) {
|
switch (attribute) {
|
||||||
case Attribute::Index::Position:
|
case Attribute::Index::Position:
|
||||||
if (stage != ShaderStage::Fragment) {
|
switch (stage) {
|
||||||
return GeometryPass("position") + GetSwizzle(element);
|
case ShaderStage::Geometry:
|
||||||
} else {
|
return fmt::format("gl_in[ftou({})].gl_Position{}", Visit(buffer),
|
||||||
|
GetSwizzle(element));
|
||||||
|
case ShaderStage::Fragment:
|
||||||
return element == 3 ? "1.0f" : ("gl_FragCoord"s + GetSwizzle(element));
|
return element == 3 ? "1.0f" : ("gl_FragCoord"s + GetSwizzle(element));
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
case Attribute::Index::PointCoord:
|
case Attribute::Index::PointCoord:
|
||||||
switch (element) {
|
switch (element) {
|
||||||
|
@ -921,7 +924,7 @@ private:
|
||||||
target = [&]() -> std::string {
|
target = [&]() -> std::string {
|
||||||
switch (const auto attribute = abuf->GetIndex(); abuf->GetIndex()) {
|
switch (const auto attribute = abuf->GetIndex(); abuf->GetIndex()) {
|
||||||
case Attribute::Index::Position:
|
case Attribute::Index::Position:
|
||||||
return "position"s + GetSwizzle(abuf->GetElement());
|
return "gl_Position"s + GetSwizzle(abuf->GetElement());
|
||||||
case Attribute::Index::PointSize:
|
case Attribute::Index::PointSize:
|
||||||
return "gl_PointSize";
|
return "gl_PointSize";
|
||||||
case Attribute::Index::ClipDistances0123:
|
case Attribute::Index::ClipDistances0123:
|
||||||
|
@ -1506,9 +1509,7 @@ private:
|
||||||
|
|
||||||
// If a geometry shader is attached, it will always flip (it's the last stage before
|
// If a geometry shader is attached, it will always flip (it's the last stage before
|
||||||
// fragment). For more info about flipping, refer to gl_shader_gen.cpp.
|
// fragment). For more info about flipping, refer to gl_shader_gen.cpp.
|
||||||
code.AddLine("position.xy *= viewport_flip.xy;");
|
code.AddLine("gl_Position.xy *= viewport_flip.xy;");
|
||||||
code.AddLine("gl_Position = position;");
|
|
||||||
code.AddLine("position.w = 1.0;");
|
|
||||||
code.AddLine("EmitVertex();");
|
code.AddLine("EmitVertex();");
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -1746,8 +1747,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 GetNumPhysicalVaryings() const {
|
u32 GetNumPhysicalVaryings() const {
|
||||||
return std::min<u32>(device.GetMaxVaryings() - GENERIC_VARYING_START_LOCATION,
|
return std::min<u32>(device.GetMaxVaryings(), Maxwell::NumVaryings);
|
||||||
Maxwell::NumVaryings);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const Device& device;
|
const Device& device;
|
||||||
|
|
|
@ -23,8 +23,6 @@ ProgramResult GenerateVertexShader(const Device& device, const ShaderSetup& setu
|
||||||
out += GetCommonDeclarations();
|
out += GetCommonDeclarations();
|
||||||
|
|
||||||
out += R"(
|
out += R"(
|
||||||
layout (location = 0) out vec4 position;
|
|
||||||
|
|
||||||
layout (std140, binding = EMULATION_UBO_BINDING) uniform vs_config {
|
layout (std140, binding = EMULATION_UBO_BINDING) uniform vs_config {
|
||||||
vec4 viewport_flip;
|
vec4 viewport_flip;
|
||||||
uvec4 config_pack; // instance_id, flip_stage, y_direction, padding
|
uvec4 config_pack; // instance_id, flip_stage, y_direction, padding
|
||||||
|
@ -48,7 +46,6 @@ layout (std140, binding = EMULATION_UBO_BINDING) uniform vs_config {
|
||||||
|
|
||||||
out += R"(
|
out += R"(
|
||||||
void main() {
|
void main() {
|
||||||
position = vec4(0.0, 0.0, 0.0, 0.0);
|
|
||||||
execute_vertex();
|
execute_vertex();
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
@ -59,19 +56,12 @@ void main() {
|
||||||
out += R"(
|
out += R"(
|
||||||
|
|
||||||
// Set Position Y direction
|
// Set Position Y direction
|
||||||
position.y *= utof(config_pack[2]);
|
gl_Position.y *= utof(config_pack[2]);
|
||||||
// Check if the flip stage is VertexB
|
// Check if the flip stage is VertexB
|
||||||
// Config pack's second value is flip_stage
|
// Config pack's second value is flip_stage
|
||||||
if (config_pack[1] == 1) {
|
if (config_pack[1] == 1) {
|
||||||
// Viewport can be flipped, which is unsupported by glViewport
|
// Viewport can be flipped, which is unsupported by glViewport
|
||||||
position.xy *= viewport_flip.xy;
|
gl_Position.xy *= viewport_flip.xy;
|
||||||
}
|
|
||||||
gl_Position = position;
|
|
||||||
|
|
||||||
// TODO(bunnei): This is likely a hack, position.w should be interpolated as 1.0
|
|
||||||
// For now, this is here to bring order in lieu of proper emulation
|
|
||||||
if (config_pack[1] == 1) {
|
|
||||||
position.w = 1.0;
|
|
||||||
}
|
}
|
||||||
})";
|
})";
|
||||||
|
|
||||||
|
@ -85,9 +75,6 @@ ProgramResult GenerateGeometryShader(const Device& device, const ShaderSetup& se
|
||||||
out += GetCommonDeclarations();
|
out += GetCommonDeclarations();
|
||||||
|
|
||||||
out += R"(
|
out += R"(
|
||||||
layout (location = 0) in vec4 gs_position[];
|
|
||||||
layout (location = 0) out vec4 position;
|
|
||||||
|
|
||||||
layout (std140, binding = EMULATION_UBO_BINDING) uniform gs_config {
|
layout (std140, binding = EMULATION_UBO_BINDING) uniform gs_config {
|
||||||
vec4 viewport_flip;
|
vec4 viewport_flip;
|
||||||
uvec4 config_pack; // instance_id, flip_stage, y_direction, padding
|
uvec4 config_pack; // instance_id, flip_stage, y_direction, padding
|
||||||
|
@ -124,8 +111,6 @@ layout (location = 5) out vec4 FragColor5;
|
||||||
layout (location = 6) out vec4 FragColor6;
|
layout (location = 6) out vec4 FragColor6;
|
||||||
layout (location = 7) out vec4 FragColor7;
|
layout (location = 7) out vec4 FragColor7;
|
||||||
|
|
||||||
layout (location = 0) in noperspective vec4 position;
|
|
||||||
|
|
||||||
layout (std140, binding = EMULATION_UBO_BINDING) uniform fs_config {
|
layout (std140, binding = EMULATION_UBO_BINDING) uniform fs_config {
|
||||||
vec4 viewport_flip;
|
vec4 viewport_flip;
|
||||||
uvec4 config_pack; // instance_id, flip_stage, y_direction, padding
|
uvec4 config_pack; // instance_id, flip_stage, y_direction, padding
|
||||||
|
|
Reference in New Issue