swr/rasterizer: Enable ARB_fragment_layer_viewport
authorJan Zielinski <jan.zielinski@intel.com>
Fri, 2 Aug 2019 10:28:13 +0000 (12:28 +0200)
committerJan Zielinski <jan.zielinski@intel.com>
Thu, 29 Aug 2019 10:09:05 +0000 (12:09 +0200)
Added loading gl_Layer and gl_ViewportIndex variables
to Pixel Shader context.

Reviewed-by: Alok Hota <alok.hota@intel.com>
docs/features.txt
src/gallium/drivers/swr/rasterizer/core/backend_impl.h
src/gallium/drivers/swr/rasterizer/core/state.h
src/gallium/drivers/swr/swr_shader.cpp

index 1fdb5f3754fedc509b875680f34c5e2c508c3d4c..a590017326a1a1b696f40bda1cdb7938d23e041f 100644 (file)
@@ -174,7 +174,7 @@ GL 4.3, GLSL 4.30 -- all DONE: i965/gen8+, nvc0, r600, radeonsi, virgl
   GL_ARB_copy_image                                     DONE (i965, nv50, softpipe, llvmpipe, swr)
   GL_KHR_debug                                          DONE (all drivers)
   GL_ARB_explicit_uniform_location                      DONE (all drivers that support GLSL)
-  GL_ARB_fragment_layer_viewport                        DONE (i965, nv50, llvmpipe, softpipe)
+  GL_ARB_fragment_layer_viewport                        DONE (i965, nv50, llvmpipe, softpipe, swr)
   GL_ARB_framebuffer_no_attachments                     DONE (freedreno, i965, softpipe)
   GL_ARB_internalformat_query2                          DONE (all drivers)
   GL_ARB_invalidate_subdata                             DONE (all drivers)
index 1bd2e743781096460ab92e7c06788a97748b323f..c6f3b0242c8f261327998cf9274f3da1f5c1783e 100644 (file)
@@ -29,6 +29,9 @@
 #pragma once
 
 #include "tilemgr.h"
+#include "state.h"
+#include "context.h"
+
 
 void InitBackendSingleFuncTable(PFN_BACKEND_FUNC (&table)[SWR_INPUT_COVERAGE_COUNT][2][2]);
 void InitBackendSampleFuncTable(
@@ -648,6 +651,7 @@ void SetupPixelShaderContext(SWR_PS_CONTEXT*            psContext,
     psContext->pPerspAttribs          = work.pPerspAttribs;
     psContext->frontFace              = work.triFlags.frontFacing;
     psContext->renderTargetArrayIndex = work.triFlags.renderTargetArrayIndex;
+    psContext->viewportIndex          = work.triFlags.viewportIndex;
 
     // save Ia/Ib/Ic and Ja/Jb/Jc if we need to reevaluate i/j/k in the shader because of pull
     // attribs
index 25d4fed957826e8d6d005fa4062a6de153e225ea..66144bbef7546e09ead4c282a3e280b6d7ef0767 100644 (file)
@@ -387,6 +387,7 @@ struct SWR_PS_CONTEXT
     uint32_t frontFace;              // IN: front- 1, back- 0
     uint32_t sampleIndex;            // IN: sampleIndex
     uint32_t renderTargetArrayIndex; // IN: render target array index from GS
+    uint32_t viewportIndex;          // IN: viewport index from GS
     uint32_t rasterizerSampleCount;  // IN: sample count used by the rasterizer
 
     uint8_t* pColorBuffer[SWR_NUM_RENDERTARGETS]; // IN: Pointers to render target hottiles
index 44fc133f530b79875322ba884f195af140b473d9..cbffaef0b1245837fb810d16beeb28bbbd337727 100644 (file)
@@ -1170,8 +1170,23 @@ BuilderSWR::CompileFS(struct swr_context *ctx, swr_jit_fs_key &key)
          inputs[attrib][3] =
             wrap(LOAD(pPS, {0, SWR_PS_CONTEXT_vOneOverW, PixelPositions_center}, "vOneOverW"));
          continue;
+      } else if (semantic_name == TGSI_SEMANTIC_LAYER) { // gl_Layer
+         Value *ff = LOAD(pPS, {0, SWR_PS_CONTEXT_renderTargetArrayIndex});
+         ff = VECTOR_SPLAT(JM()->mVWidth, ff, "vRenderTargetArrayIndex");
+         inputs[attrib][0] = wrap(ff);
+         inputs[attrib][1] = wrap(VIMMED1(0.0f));
+         inputs[attrib][2] = wrap(VIMMED1(0.0f));
+         inputs[attrib][3] = wrap(VIMMED1(0.0f));
+         continue;
+      } else if (semantic_name == TGSI_SEMANTIC_VIEWPORT_INDEX) { // gl_ViewportIndex
+         Value *ff = LOAD(pPS, {0, SWR_PS_CONTEXT_viewportIndex});
+         ff = VECTOR_SPLAT(JM()->mVWidth, ff, "vViewportIndex");
+         inputs[attrib][0] = wrap(ff);
+         inputs[attrib][1] = wrap(VIMMED1(0.0f));
+         inputs[attrib][2] = wrap(VIMMED1(0.0f));
+         inputs[attrib][3] = wrap(VIMMED1(0.0f));
+         continue;
       }
-
       unsigned linkedAttrib =
          locate_linkage(semantic_name, semantic_idx, pPrevShader) - 1;