|
|
@@ -569,7 +569,23 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|
|
|
|
|
if (context.Config.TransformFeedbackEnabled && context.Config.Stage == ShaderStage.Fragment)
|
|
|
{
|
|
|
- for (int c = 0; c < 4; c++)
|
|
|
+ int attrOffset = AttributeConsts.UserAttributeBase + attr * 16;
|
|
|
+ int components = context.Info.GetTransformFeedbackOutputComponents(attrOffset);
|
|
|
+
|
|
|
+ if (components > 1)
|
|
|
+ {
|
|
|
+ string type = components switch
|
|
|
+ {
|
|
|
+ 2 => "vec2",
|
|
|
+ 3 => "vec3",
|
|
|
+ 4 => "vec4",
|
|
|
+ _ => "float"
|
|
|
+ };
|
|
|
+
|
|
|
+ context.AppendLine($"layout (location = {attr}) in {type} {name};");
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int c = components > 1 ? components : 0; c < 4; c++)
|
|
|
{
|
|
|
char swzMask = "xyzw"[c];
|
|
|
|
|
|
@@ -642,7 +658,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|
|
if (context.Config.TransformFeedbackEnabled && context.Config.LastInVertexPipeline)
|
|
|
{
|
|
|
int attrOffset = AttributeConsts.UserAttributeBase + attr * 16;
|
|
|
- int components = context.Config.LastInPipeline ? context.Info.GetTransformFeedbackOutputComponents(attrOffset) : 1;
|
|
|
+ int components = context.Info.GetTransformFeedbackOutputComponents(attrOffset);
|
|
|
|
|
|
if (components > 1)
|
|
|
{
|
|
|
@@ -664,22 +680,20 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|
|
|
|
|
context.AppendLine($"layout (location = {attr}{xfb}) out {type} {name};");
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- for (int c = 0; c < 4; c++)
|
|
|
- {
|
|
|
- char swzMask = "xyzw"[c];
|
|
|
|
|
|
- string xfb = string.Empty;
|
|
|
+ for (int c = components > 1 ? components : 0; c < 4; c++)
|
|
|
+ {
|
|
|
+ char swzMask = "xyzw"[c];
|
|
|
|
|
|
- var tfOutput = context.Info.GetTransformFeedbackOutput(attrOffset + c * 4);
|
|
|
- if (tfOutput.Valid)
|
|
|
- {
|
|
|
- xfb = $", xfb_buffer = {tfOutput.Buffer}, xfb_offset = {tfOutput.Offset}, xfb_stride = {tfOutput.Stride}";
|
|
|
- }
|
|
|
+ string xfb = string.Empty;
|
|
|
|
|
|
- context.AppendLine($"layout (location = {attr}, component = {c}{xfb}) out float {name}_{swzMask};");
|
|
|
+ var tfOutput = context.Info.GetTransformFeedbackOutput(attrOffset + c * 4);
|
|
|
+ if (tfOutput.Valid)
|
|
|
+ {
|
|
|
+ xfb = $", xfb_buffer = {tfOutput.Buffer}, xfb_offset = {tfOutput.Offset}, xfb_stride = {tfOutput.Stride}";
|
|
|
}
|
|
|
+
|
|
|
+ context.AppendLine($"layout (location = {attr}, component = {c}{xfb}) out float {name}_{swzMask};");
|
|
|
}
|
|
|
}
|
|
|
else
|