aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorJan Zielinski <[email protected]>2019-08-02 12:28:13 +0200
committerJan Zielinski <[email protected]>2019-08-29 12:09:05 +0200
commite64091ebd4187a383b122060d358780a376772a6 (patch)
tree28b4488f4452ce6df39743769e262f5736e83038 /src/gallium
parent6dc4ddc5f81f7a3041eb61370dbb7edf90a92a6a (diff)
swr/rasterizer: Enable ARB_fragment_layer_viewport
Added loading gl_Layer and gl_ViewportIndex variables to Pixel Shader context. Reviewed-by: Alok Hota <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/swr/rasterizer/core/backend_impl.h4
-rw-r--r--src/gallium/drivers/swr/rasterizer/core/state.h1
-rw-r--r--src/gallium/drivers/swr/swr_shader.cpp17
3 files changed, 21 insertions, 1 deletions
diff --git a/src/gallium/drivers/swr/rasterizer/core/backend_impl.h b/src/gallium/drivers/swr/rasterizer/core/backend_impl.h
index 1bd2e743781..c6f3b0242c8 100644
--- a/src/gallium/drivers/swr/rasterizer/core/backend_impl.h
+++ b/src/gallium/drivers/swr/rasterizer/core/backend_impl.h
@@ -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
diff --git a/src/gallium/drivers/swr/rasterizer/core/state.h b/src/gallium/drivers/swr/rasterizer/core/state.h
index 25d4fed9578..66144bbef75 100644
--- a/src/gallium/drivers/swr/rasterizer/core/state.h
+++ b/src/gallium/drivers/swr/rasterizer/core/state.h
@@ -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
diff --git a/src/gallium/drivers/swr/swr_shader.cpp b/src/gallium/drivers/swr/swr_shader.cpp
index 44fc133f530..cbffaef0b12 100644
--- a/src/gallium/drivers/swr/swr_shader.cpp
+++ b/src/gallium/drivers/swr/swr_shader.cpp
@@ -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;