i965: Set up sampler state for compute shaders
authorJordan Justen <jordan.l.justen@intel.com>
Sat, 4 Oct 2014 02:07:45 +0000 (19:07 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Thu, 10 Sep 2015 23:46:29 +0000 (16:46 -0700)
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
src/mesa/drivers/dri/i965/brw_cs.cpp

index 8197e6a69ddd052ecc1530073a70673eacba571a..605a3fa005889dad4aa66941a837d3336bdc7d78 100644 (file)
@@ -225,12 +225,18 @@ brw_codegen_cs_prog(struct brw_context *brw,
 static void
 brw_cs_populate_key(struct brw_context *brw, struct brw_cs_prog_key *key)
 {
+   struct gl_context *ctx = &brw->ctx;
    /* BRW_NEW_COMPUTE_PROGRAM */
    const struct brw_compute_program *cp =
       (struct brw_compute_program *) brw->compute_program;
+   const struct gl_program *prog = (struct gl_program *) cp;
 
    memset(key, 0, sizeof(*key));
 
+   /* _NEW_TEXTURE */
+   brw_populate_sampler_prog_key_data(ctx, prog, brw->cs.base.sampler_count,
+                                      &key->tex);
+
    /* The unique compute program ID */
    key->program_string_id = cp->id;
 }
@@ -248,9 +254,12 @@ brw_upload_cs_prog(struct brw_context *brw)
    if (!cp)
       return;
 
-   if (!brw_state_dirty(brw, 0, BRW_NEW_COMPUTE_PROGRAM))
+   if (!brw_state_dirty(brw, _NEW_TEXTURE, BRW_NEW_COMPUTE_PROGRAM))
       return;
 
+   brw->cs.base.sampler_count =
+      _mesa_fls(ctx->ComputeProgram._Current->Base.SamplersUsed);
+
    brw_cs_populate_key(brw, &key);
 
    if (!brw_search_cache(&brw->cache, BRW_CACHE_CS_PROG,
@@ -413,7 +422,8 @@ brw_upload_cs_state(struct brw_context *brw)
    if (brw->gen >= 8)
       desc[dw++] = 0; /* Kernel Start Pointer High */
    desc[dw++] = 0;
-   desc[dw++] = 0;
+   desc[dw++] = stage_state->sampler_offset |
+      ((stage_state->sampler_count + 3) / 4);
    desc[dw++] = stage_state->bind_bo_offset;
    desc[dw++] = SET_FIELD(push_constant_regs, MEDIA_CURBE_READ_LENGTH);
    const uint32_t media_threads =