i965: Split sampler count variable to be per-stage.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 21 Aug 2012 22:24:14 +0000 (15:24 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 19 Aug 2013 20:16:59 +0000 (13:16 -0700)
Currently, we only have a single sampler state table shared among all
stages, so we just copy wm.sampler_count into vs.sampler_count.

In the future, each shader stage will have its own SAMPLER_STATE table,
at which point we'll need these separate sampler counts.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_vs_state.c
src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
src/mesa/drivers/dri/i965/brw_wm_state.c
src/mesa/drivers/dri/i965/gen6_vs_state.c
src/mesa/drivers/dri/i965/gen6_wm_state.c
src/mesa/drivers/dri/i965/gen7_sampler_state.c
src/mesa/drivers/dri/i965/gen7_vs_state.c
src/mesa/drivers/dri/i965/gen7_wm_state.c

index 419cf174092fd5b27e380f0c9ed5118a81853c37..d7c3472fa2e31edd99bdcea18979b1c8590f2a71 100644 (file)
@@ -1066,7 +1066,6 @@ struct brw_context
 
    /** SAMPLER_STATE count and offset */
    struct {
-      GLuint count;
       uint32_t offset;
    } sampler;
 
@@ -1110,6 +1109,8 @@ struct brw_context
 
       uint32_t bind_bo_offset;
       uint32_t surf_offset[BRW_MAX_VS_SURFACES];
+
+      uint32_t sampler_count;
    } vs;
 
    struct {
@@ -1183,6 +1184,8 @@ struct brw_context
       uint32_t bind_bo_offset;
       uint32_t surf_offset[BRW_MAX_WM_SURFACES];
 
+      uint32_t sampler_count;
+
       struct {
          struct ra_regs *regs;
 
index ddaf914f103eb861bf772e981e076e326b2e9984..13aabac43d981cf35bc97317fa1d55fa465f6c92 100644 (file)
@@ -142,7 +142,7 @@ brw_upload_vs_unit(struct brw_context *brw)
       vs->vs5.sampler_count = 0; /* hardware requirement */
    else {
       /* CACHE_NEW_SAMPLER */
-      vs->vs5.sampler_count = (brw->sampler.count + 3) / 4;
+      vs->vs5.sampler_count = (brw->vs.sampler_count + 3) / 4;
    }
 
 
@@ -155,7 +155,7 @@ brw_upload_vs_unit(struct brw_context *brw)
 
    /* Set the sampler state pointer, and its reloc
     */
-   if (brw->sampler.count) {
+   if (brw->vs.sampler_count) {
       vs->vs5.sampler_state_pointer =
          (brw->batch.bo->offset + brw->sampler.offset) >> 5;
       drm_intel_bo_emit_reloc(brw->batch.bo,
index 5457671b19f198993e624ef80a9aa342ec200cd4..40a6d5be1d630e91be38fec49dfc95ef024f0337 100644 (file)
@@ -377,17 +377,19 @@ brw_upload_samplers(struct brw_context *brw)
    /* ARB programs use the texture unit number as the sampler index, so we
     * need to find the highest unit used.  A bit-count will not work.
     */
-   brw->sampler.count = _mesa_fls(SamplersUsed);
+   brw->wm.sampler_count = _mesa_fls(SamplersUsed);
+   /* Currently we only use one sampler state table.  Mirror the count. */
+   brw->vs.sampler_count = brw->wm.sampler_count;
 
-   if (brw->sampler.count == 0)
+   if (brw->wm.sampler_count == 0)
       return;
 
    samplers = brw_state_batch(brw, AUB_TRACE_SAMPLER_STATE,
-                             brw->sampler.count * sizeof(*samplers),
+                             brw->wm.sampler_count * sizeof(*samplers),
                              32, &brw->sampler.offset);
-   memset(samplers, 0, brw->sampler.count * sizeof(*samplers));
+   memset(samplers, 0, brw->wm.sampler_count * sizeof(*samplers));
 
-   for (unsigned s = 0; s < brw->sampler.count; s++) {
+   for (unsigned s = 0; s < brw->wm.sampler_count; s++) {
       if (SamplersUsed & (1 << s)) {
          const unsigned unit = (fs->SamplersUsed & (1 << s)) ?
             fs->SamplerUnits[s] : vs->SamplerUnits[s];
index 631f351699b3325edf4f9db93fce0dac66a64fdd..106d6287bf2d4e3cc61eb5e670613de8a6250787 100644 (file)
@@ -144,10 +144,10 @@ brw_upload_wm_unit(struct brw_context *brw)
       wm->wm4.sampler_count = 0; /* hardware requirement */
    else {
       /* CACHE_NEW_SAMPLER */
-      wm->wm4.sampler_count = (brw->sampler.count + 1) / 4;
+      wm->wm4.sampler_count = (brw->wm.sampler_count + 1) / 4;
    }
 
-   if (brw->sampler.count) {
+   if (brw->wm.sampler_count) {
       /* reloc */
       wm->wm4.sampler_state_pointer = (brw->batch.bo->offset +
                                       brw->sampler.offset) >> 5;
@@ -225,7 +225,7 @@ brw_upload_wm_unit(struct brw_context *brw)
    }
 
    /* Emit sampler state relocation */
-   if (brw->sampler.count != 0) {
+   if (brw->wm.sampler_count != 0) {
       drm_intel_bo_emit_reloc(brw->batch.bo,
                              brw->wm.state_offset +
                              offsetof(struct brw_wm_unit_state, wm4),
index da20713e93febdcf2a551539a093ed4d9a4f1031..4af7cda180a710fd83e17d56cdc67e777f064a12 100644 (file)
@@ -149,7 +149,7 @@ upload_vs_state(struct brw_context *brw)
    OUT_BATCH(_3DSTATE_VS << 16 | (6 - 2));
    OUT_BATCH(brw->vs.prog_offset);
    OUT_BATCH(floating_point_mode |
-            ((ALIGN(brw->sampler.count, 4)/4) << GEN6_VS_SAMPLER_COUNT_SHIFT));
+            ((ALIGN(brw->vs.sampler_count, 4)/4) << GEN6_VS_SAMPLER_COUNT_SHIFT));
 
    if (brw->vs.prog_data->base.total_scratch) {
       OUT_RELOC(brw->vs.scratch_bo,
index 24c96ccc1a1cb744b1c2e0c5f7e75262e36e7b70..e2867855212c98a11fd8fce0817b942d2bfd64d2 100644 (file)
@@ -140,7 +140,7 @@ upload_wm_state(struct brw_context *brw)
       dw2 |= GEN6_WM_FLOATING_POINT_MODE_ALT;
 
    /* CACHE_NEW_SAMPLER */
-   dw2 |= (ALIGN(brw->sampler.count, 4) / 4) << GEN6_WM_SAMPLER_COUNT_SHIFT;
+   dw2 |= (ALIGN(brw->wm.sampler_count, 4) / 4) << GEN6_WM_SAMPLER_COUNT_SHIFT;
    dw4 |= (brw->wm.prog_data->first_curbe_grf <<
           GEN6_WM_DISPATCH_START_GRF_SHIFT_0);
    dw4 |= (brw->wm.prog_data->first_curbe_grf_16 <<
index 7ce58ce2a4a9a9afd5760f4648c890eef4bb9ef0..f09c6b3ffe6dda214596df3eb2696898e134ee69 100644 (file)
@@ -195,17 +195,19 @@ gen7_upload_samplers(struct brw_context *brw)
 
    GLbitfield SamplersUsed = vs->SamplersUsed | fs->SamplersUsed;
 
-   brw->sampler.count = _mesa_fls(SamplersUsed);
+   brw->wm.sampler_count = _mesa_fls(SamplersUsed);
+   /* Currently we only use one sampler state table.  Mirror the count. */
+   brw->vs.sampler_count = brw->wm.sampler_count;
 
-   if (brw->sampler.count == 0)
+   if (brw->wm.sampler_count == 0)
       return;
 
    samplers = brw_state_batch(brw, AUB_TRACE_SAMPLER_STATE,
-                             brw->sampler.count * sizeof(*samplers),
+                             brw->wm.sampler_count * sizeof(*samplers),
                              32, &brw->sampler.offset);
-   memset(samplers, 0, brw->sampler.count * sizeof(*samplers));
+   memset(samplers, 0, brw->wm.sampler_count * sizeof(*samplers));
 
-   for (unsigned s = 0; s < brw->sampler.count; s++) {
+   for (unsigned s = 0; s < brw->wm.sampler_count; s++) {
       if (SamplersUsed & (1 << s)) {
          const unsigned unit = (fs->SamplersUsed & (1 << s)) ?
             fs->SamplerUnits[s] : vs->SamplerUnits[s];
index 0340da4ba1250ecf52b928e2df650a784bede009..634bd95a8736986225f9df13be716575b0417428 100644 (file)
@@ -89,7 +89,7 @@ upload_vs_state(struct brw_context *brw)
    OUT_BATCH(_3DSTATE_VS << 16 | (6 - 2));
    OUT_BATCH(brw->vs.prog_offset);
    OUT_BATCH(floating_point_mode |
-            ((ALIGN(brw->sampler.count, 4)/4) << GEN6_VS_SAMPLER_COUNT_SHIFT));
+            ((ALIGN(brw->vs.sampler_count, 4)/4) << GEN6_VS_SAMPLER_COUNT_SHIFT));
 
    if (brw->vs.prog_data->base.total_scratch) {
       OUT_RELOC(brw->vs.scratch_bo,
index 1bc6e2ec231f0750a6f79d574ce6e09695998d53..d079a52f315456ddac949d7cd031d4322e868c98 100644 (file)
@@ -162,7 +162,7 @@ upload_ps_state(struct brw_context *brw)
    dw2 = dw4 = dw5 = 0;
 
    /* CACHE_NEW_SAMPLER */
-   dw2 |= (ALIGN(brw->sampler.count, 4) / 4) << GEN7_PS_SAMPLER_COUNT_SHIFT;
+   dw2 |= (ALIGN(brw->wm.sampler_count, 4) / 4) << GEN7_PS_SAMPLER_COUNT_SHIFT;
 
    /* Use ALT floating point mode for ARB fragment programs, because they
     * require 0^0 == 1.  Even though _CurrentFragmentProgram is used for