OSDN Git Service

Wire up FS input to the shader
authorChris Forbes <chrisforbes@google.com>
Sun, 10 Feb 2019 21:03:00 +0000 (21:03 +0000)
committerChris Forbes <chrisforbes@google.com>
Fri, 15 Feb 2019 19:32:32 +0000 (19:32 +0000)
Bug: b/124177079
Change-Id: I8dac28d2c55ce1c4eb9a815bfad56ba917be32c5
Reviewed-on: https://swiftshader-review.googlesource.com/c/24593
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>

src/Device/PixelProcessor.cpp
src/Device/PixelProcessor.hpp
src/Device/Primitive.hpp
src/Device/QuadRasterizer.cpp
src/Device/QuadRasterizer.hpp
src/Pipeline/PixelRoutine.cpp
src/Pipeline/PixelRoutine.hpp

index 6579a75..fcbee9f 100644 (file)
@@ -709,44 +709,6 @@ namespace sw
 
                const bool point = context->isDrawPoint();
 
-               /* TODO: bring back interpolants by some mechanism */
-//             for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
-//             {
-//                     for(int component = 0; component < 4; component++)
-//                     {
-//                             const Shader::Semantic &semantic = context->pixelShader->getInput(interpolant, component);
-//
-//                             if(semantic.active())
-//                             {
-//                                     bool flat = point;
-//
-//                                     switch(semantic.usage)
-//                                     {
-//                                     case Shader::USAGE_TEXCOORD: flat = false;                  break;
-//                                     case Shader::USAGE_COLOR:    flat = semantic.flat || point; break;
-//                                     }
-//
-//                                     state.interpolant[interpolant].component |= 1 << component;
-//
-//                                     if(flat)
-//                                     {
-//                                             state.interpolant[interpolant].flat |= 1 << component;
-//                                     }
-//                             }
-//                     }
-//             }
-//
-//             if(state.centroid)
-//             {
-//                     for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
-//                     {
-//                             for(int component = 0; component < 4; component++)
-//                             {
-//                                     state.interpolant[interpolant].centroid = context->pixelShader->getInput(interpolant, 0).centroid;
-//                             }
-//                     }
-//             }
-
                state.hash = state.computeHash();
 
                return state;
index 7a92dc5..268e127 100644 (file)
@@ -83,15 +83,6 @@ namespace sw
                        VkLogicOp logicalOperation : BITS(VK_LOGIC_OP_END_RANGE);
 
                        Sampler::State sampler[TEXTURE_IMAGE_UNITS];
-
-                       struct Interpolant
-                       {
-                               unsigned char component : 4;
-                               unsigned char flat : 4;
-                               bool centroid : 1;
-                       };
-
-                       Interpolant interpolant[MAX_FRAGMENT_INPUTS];
                };
 
                struct State : States
index a6aaa43..1e085f7 100644 (file)
@@ -47,14 +47,7 @@ namespace sw
 
                union
                {
-                       struct
-                       {
-                               PlaneEquation C[2][4];
-                               PlaneEquation T[8][4];
-                               PlaneEquation f;
-                       };
-
-                       PlaneEquation V[MAX_FRAGMENT_INPUTS][4];
+                       PlaneEquation V[MAX_INTERFACE_COMPONENTS];
                };
 
                float area;
index 770bf28..bfd87e1 100644 (file)
@@ -238,19 +238,15 @@ namespace sw
                                        Dw = *Pointer<Float4>(primitive + OFFSET(Primitive,w.C), 16) + yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive,w.B), 16);
                                }
 
-                               for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
+                               for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
                                {
-                                       for(int component = 0; component < 4; component++)
-                                       {
-                                               if(state.interpolant[interpolant].component & (1 << component))
-                                               {
-                                                       Dv[interpolant][component] = *Pointer<Float4>(primitive + OFFSET(Primitive,V[interpolant][component].C), 16);
+                                       if (spirvShader->inputs[interpolant].Type == SpirvShader::ATTRIBTYPE_UNUSED)
+                                               continue;
 
-                                                       if(!(state.interpolant[interpolant].flat & (1 << component)))
-                                                       {
-                                                               Dv[interpolant][component] += yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive,V[interpolant][component].B), 16);
-                                                       }
-                                               }
+                                       Dv[interpolant] = *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].C), 16);
+                                       if (!spirvShader->inputs[interpolant].Flat)
+                                       {
+                                               Dv[interpolant] += yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].B), 16);
                                        }
                                }
 
index b04deb9..456887d 100644 (file)
@@ -35,7 +35,7 @@ namespace sw
 
                Float4 Dz[4];
                Float4 Dw;
-               Float4 Dv[MAX_FRAGMENT_INPUTS][4];
+               Float4 Dv[MAX_INTERFACE_COMPONENTS];
                Float4 Df;
 
                UInt occlusion;
index 722bd33..9d9e445 100644 (file)
@@ -30,20 +30,17 @@ namespace sw
        extern bool forceClearRegisters;
 
        PixelRoutine::PixelRoutine(const PixelProcessor::State &state, SpirvShader const *spirvShader)
-               : QuadRasterizer(state, spirvShader), v(true)   /* addressing */
+               : QuadRasterizer(state, spirvShader)    /* addressing */
        {
-               if(forceClearRegisters)
+               spirvShader->emitEarly(&routine);
+
+               if (forceClearRegisters)
                {
-                       for(int i = 0; i < MAX_FRAGMENT_INPUTS; i++)
+                       for (int i = 0; i < MAX_INTERFACE_COMPONENTS; i++)
                        {
-                               v[i].x = Float4(0.0f);
-                               v[i].y = Float4(0.0f);
-                               v[i].z = Float4(0.0f);
-                               v[i].w = Float4(0.0f);
+                               (*routine.inputs)[i] = Float4(0.0f);
                        }
                }
-
-               spirvShader->emitEarly(&routine);
        }
 
        PixelRoutine::~PixelRoutine()
@@ -144,21 +141,24 @@ namespace sw
                                }
                        }
 
-                       // TODO: rethink what we want to do here for pull-mode interpolation
-                       for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
+                       for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
                        {
-                               for(int component = 0; component < 4; component++)
+                               auto const & input = spirvShader->inputs[interpolant];
+                               if (input.Type != SpirvShader::ATTRIBTYPE_UNUSED)
                                {
-                                       if(state.interpolant[interpolant].component & (1 << component))
+                                       if (input.Centroid)
                                        {
-                                               if(!state.interpolant[interpolant].centroid)
-                                               {
-                                                       v[interpolant][component] = interpolate(xxxx, Dv[interpolant][component], rhw, primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective, false);
-                                               }
-                                               else
-                                               {
-                                                       v[interpolant][component] = interpolateCentroid(XXXX, YYYY, rhwCentroid, primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective);
-                                               }
+                                               (*routine.inputs)[interpolant] =
+                                                               interpolateCentroid(XXXX, YYYY, rhwCentroid,
+                                                                                                       primitive + OFFSET(Primitive, V[interpolant]),
+                                                                                                       input.Flat, state.perspective);
+                                       }
+                                       else
+                                       {
+                                               (*routine.inputs)[interpolant] =
+                                                               interpolate(xxxx, Dv[interpolant], rhw,
+                                                                                       primitive + OFFSET(Primitive, V[interpolant]),
+                                                                                       input.Flat, state.perspective, false);
                                        }
                                }
                        }
index 979f539..ed8cdb1 100644 (file)
@@ -34,7 +34,6 @@ namespace sw
                Float4 w;    // Used as is
                Float4 rhw;  // Reciprocal w
 
-               RegisterArray<MAX_FRAGMENT_INPUTS> v;   // Varying registers
                SpirvRoutine routine;
 
                // Depth output