[Mesa-dev] [PATCH] i965/gs: Implement basic gl_PrimitiveIDIn functionality.

Paul Berry stereotype441 at gmail.com
Sat Sep 14 10:33:58 PDT 2013


If the geometry shader refers to the built-in variable
gl_PrimitiveIDIn, we need to set a bit in 3DSTATE_GS to tell the
hardware to dispatch primitive ID to r1, and we need to leave room for
it when allocating registers.

Note: this feature doesn't yet work properly when software primitive
restart is in use (the primitive ID counter will incorrectly reset
with each primitive restart, since software primitive restart works by
performing multiple draw calls).  I plan to address that in a future
patch series.

Fixes piglit test "spec/glsl-1.50/execution/geometry/primitive-id-in".
---
 src/mesa/drivers/dri/i965/brw_context.h           | 2 ++
 src/mesa/drivers/dri/i965/brw_vec4_gs.c           | 3 +++
 src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp | 4 ++++
 src/mesa/drivers/dri/i965/gen7_gs_state.c         | 2 ++
 4 files changed, 11 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index 108e98c..606611a 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -562,6 +562,8 @@ struct brw_gs_prog_data
     * Ignored if control_data_header_size is 0.
     */
    unsigned control_data_format;
+
+   bool include_primitive_id;
 };
 
 /** Number of texture sampler units */
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs.c b/src/mesa/drivers/dri/i965/brw_vec4_gs.c
index f67ae2b..3e7faee 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_vec4_gs.c
@@ -45,6 +45,9 @@ do_gs_prog(struct brw_context *brw,
    c.key = *key;
    c.gp = gp;
 
+   c.prog_data.include_primitive_id =
+      (gp->program.Base.InputsRead & VARYING_BIT_PRIMITIVE_ID) != 0;
+
    /* Allocate the references to the uniforms that will end up in the
     * prog_data associated with the compiled program, and which will be freed
     * by the state cache.
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
index 960f970..6053284 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
@@ -102,6 +102,10 @@ vec4_gs_visitor::setup_payload()
     */
    reg++;
 
+   /* If the shader uses gl_PrimitiveIDIn, that goes in r1. */
+   if (c->prog_data.include_primitive_id)
+      attribute_map[VARYING_SLOT_PRIMITIVE_ID] = reg++;
+
    reg = setup_uniforms(reg);
 
    reg = setup_varying_inputs(reg, attribute_map);
diff --git a/src/mesa/drivers/dri/i965/gen7_gs_state.c b/src/mesa/drivers/dri/i965/gen7_gs_state.c
index 231e3c9..4f18485 100644
--- a/src/mesa/drivers/dri/i965/gen7_gs_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_gs_state.c
@@ -111,6 +111,8 @@ upload_gs_state(struct brw_context *brw)
           GEN7_GS_CONTROL_DATA_HEADER_SIZE_SHIFT) |
          GEN7_GS_DISPATCH_MODE_DUAL_OBJECT |
          GEN6_GS_STATISTICS_ENABLE |
+         (brw->gs.prog_data->include_primitive_id ?
+          GEN7_GS_INCLUDE_PRIMITIVE_ID : 0) |
          GEN7_GS_ENABLE;
 
       if (brw->is_haswell) {
-- 
1.8.4



More information about the mesa-dev mailing list