r600g: Implement sm5 geometry shader instancing
authorGlenn Kennard <glenn.kennard@gmail.com>
Mon, 25 Aug 2014 09:05:06 +0000 (11:05 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 1 Sep 2014 19:12:03 +0000 (21:12 +0200)
Requires Evergreen or later hardware.

Signed-off-by: Glenn Kennard <glenn.kennard@gmail.com>
docs/GL3.txt
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600_shader.c
src/gallium/drivers/r600/r600_shader.h

index 3d7a450c9e91e12e73ebfc4820ffeb4d807516e2..f5d5e72c9619b74d217f2a9f847703d76fb92ae9 100644 (file)
@@ -104,7 +104,7 @@ GL 4.0, GLSL 4.00:
   - Fused multiply-add                                 DONE ()
   - Packing/bitfield/conversion functions              DONE (r600)
   - Enhanced textureGather                             DONE (r600, radeonsi)
-  - Geometry shader instancing                         DONE ()
+  - Geometry shader instancing                         DONE (r600)
   - Geometry shader multiple streams                   DONE ()
   - Enhanced per-sample shading                        DONE (r600)
   - Interpolation functions                            DONE ()
index 9f0e82dd1c08c6e585ce8ac3ed55557dd7cb3a07..8ce31dca81e4303b9570235e2a2e1d3fe1acfac0 100644 (file)
@@ -2963,8 +2963,8 @@ void evergreen_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader
 
        if (rctx->screen->b.info.drm_minor >= 35) {
                r600_store_context_reg(cb, R_028B90_VGT_GS_INSTANCE_CNT,
-                               S_028B90_CNT(0) |
-                               S_028B90_ENABLE(0));
+                               S_028B90_CNT(MIN2(rshader->gs_num_invocations, 127)) |
+                               S_028B90_ENABLE(rshader->gs_num_invocations > 0));
        }
        r600_store_context_reg_seq(cb, R_02891C_SQ_GS_VERT_ITEMSIZE, 4);
        r600_store_value(cb, cp_shader->ring_item_size >> 2);
index 3f089b4f7d9dbd3569c92b4a2d381edb2664890d..9f10c20c4c34c2f24305d41899a8f73e8b427327 100644 (file)
@@ -706,6 +706,8 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
                        break;
                } else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
                        break;
+               else if (d->Semantic.Name == TGSI_SEMANTIC_INVOCATIONID)
+                       break;
        default:
                R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
                return -EINVAL;
@@ -811,6 +813,12 @@ static void tgsi_src(struct r600_shader_ctx *ctx,
                        r600_src->swizzle[2] = 0;
                        r600_src->swizzle[3] = 0;
                        r600_src->sel = 0;
+               } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INVOCATIONID) {
+                       r600_src->swizzle[0] = 3;
+                       r600_src->swizzle[1] = 3;
+                       r600_src->swizzle[2] = 3;
+                       r600_src->swizzle[3] = 3;
+                       r600_src->sel = 1;
                }
        } else {
                if (tgsi_src->Register.Indirect)
@@ -1753,6 +1761,9 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
                        case TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES:
                                shader->gs_max_out_vertices = property->u[0].Data;
                                break;
+                       case TGSI_PROPERTY_GS_INVOCATIONS:
+                               shader->gs_num_invocations = property->u[0].Data;
+                               break;
                        }
                        break;
                default:
index d6db8f063ac310452c1a6933f9d972c25471147c..4b27ede96ddc746845d0b67bcc489cd0f86f135e 100644 (file)
@@ -74,6 +74,7 @@ struct r600_shader {
        unsigned                gs_input_prim;
        unsigned                gs_output_prim;
        unsigned                gs_max_out_vertices;
+       unsigned                gs_num_invocations;
        /* size in bytes of a data item in the ring (single vertex data) */
        unsigned                ring_item_size;