Mesa (master): gallium/swr: Fix GS invocation issues

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 8 14:52:21 UTC 2019


Module: Mesa
Branch: master
Commit: e5ed9a1b91b6c047a229296908ef461dabac049a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e5ed9a1b91b6c047a229296908ef461dabac049a

Author: Krzysztof Raszkowski <krzysztof.raszkowski at intel.com>
Date:   Fri Nov  8 14:52:16 2019 +0000

gallium/swr: Fix GS invocation issues
- Fixed proper setting gl_InvocationID.
- Fixed GS vertices output memory overflow.

Reviewed-by: Jan Zielinski <jan.zielinski at intel.com>

---

 src/gallium/drivers/swr/swr_shader.cpp | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/swr/swr_shader.cpp b/src/gallium/drivers/swr/swr_shader.cpp
index e5e5411fb10..20e855b988d 100644
--- a/src/gallium/drivers/swr/swr_shader.cpp
+++ b/src/gallium/drivers/swr/swr_shader.cpp
@@ -621,7 +621,12 @@ BuilderSWR::CompileGS(struct swr_context *ctx, swr_jit_gs_key &key)
    pGS->numInputAttribs = (VERTEX_ATTRIB_START_SLOT - VERTEX_POSITION_SLOT) + info->num_inputs;
    pGS->outputTopology =
       swr_convert_prim_topology(info->properties[TGSI_PROPERTY_GS_OUTPUT_PRIM]);
-   pGS->maxNumVerts = info->properties[TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES];
+
+   /* It's +1 because emit_vertex in swr is always called exactly one time more
+    * than max_vertices passed in Geometry Shader. We need to allocate more memory
+    * to avoid crash/memory overwritten.
+    */
+   pGS->maxNumVerts = info->properties[TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES] + 1;
    pGS->instanceCount = info->properties[TGSI_PROPERTY_GS_INVOCATIONS];
 
    // If point primitive then assume to use multiple streams
@@ -699,7 +704,7 @@ BuilderSWR::CompileGS(struct swr_context *ctx, swr_jit_gs_key &key)
    struct lp_bld_tgsi_system_values system_values;
    memset(&system_values, 0, sizeof(system_values));
    system_values.prim_id = wrap(LOAD(pGsCtx, {0, SWR_GS_CONTEXT_PrimitiveID}));
-   system_values.instance_id = wrap(LOAD(pGsCtx, {0, SWR_GS_CONTEXT_InstanceID}));
+   system_values.invocation_id = wrap(LOAD(pGsCtx, {0, SWR_GS_CONTEXT_InstanceID}));
 
    std::vector<Constant*> mapConstants;
    Value *vtxAttribMap = ALLOCA(ArrayType::get(mInt32Ty, PIPE_MAX_SHADER_INPUTS));




More information about the mesa-commit mailing list