aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.h51
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.cpp29
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_generator.cpp2
3 files changed, 25 insertions, 57 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index 4e26460267b..68a78678565 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -678,62 +678,11 @@ struct brw_gs_prog_data
/** Maximum number of actual buffers used for stream output */
#define BRW_MAX_SOL_BUFFERS 4
-/**
- * Helpers to create Surface Binding Table indexes for draw buffers,
- * textures, and constant buffers.
- *
- * Shader threads access surfaces via numeric handles, rather than directly
- * using pointers. The binding table maps these numeric handles to the
- * address of the actual buffer.
- *
- * For example, a shader might ask to sample from "surface 7." In this case,
- * bind[7] would contain a pointer to a texture.
- *
- *
- * Our VS (and Gen7 GS) binding tables are programmed as follows:
- *
- * +-----+-------------------------+
- * | 0 | Pull Constant Buffer |
- * +-----+-------------------------+
- * | 1 | Texture 0 |
- * | . | . |
- * | : | : |
- * | 16 | Texture 15 |
- * +-----+-------------------------+
- * | 17 | UBO 0 |
- * | . | . |
- * | : | : |
- * | 28 | UBO 11 |
- * |-----|-------------------------|
- * | 29 | Shader time buffer |
- * |-----|-------------------------|
- * | 30 | Gather texture 0 |
- * | . | . |
- * | : | : |
- * | 45 | Gather texture 15 |
- * +-------------------------------+
- *
- * Our (gen6) GS binding tables are programmed as follows:
- *
- * +-----+-------------------------+
- * | 0 | SOL Binding 0 |
- * | . | . |
- * | : | : |
- * | 63 | SOL Binding 63 |
- * +-----+-------------------------+
- */
#define BRW_MAX_SURFACES (BRW_MAX_DRAW_BUFFERS + \
BRW_MAX_TEX_UNIT * 2 + /* normal, gather */ \
12 + /* ubo */ \
2 /* shader time, pull constants */)
-#define SURF_INDEX_VEC4_CONST_BUFFER (0)
-#define SURF_INDEX_VEC4_TEXTURE(t) (SURF_INDEX_VEC4_CONST_BUFFER + 1 + (t))
-#define SURF_INDEX_VEC4_UBO(u) (SURF_INDEX_VEC4_TEXTURE(BRW_MAX_TEX_UNIT) + u)
-#define SURF_INDEX_VEC4_SHADER_TIME (SURF_INDEX_VEC4_UBO(12))
-#define SURF_INDEX_VEC4_GATHER_TEXTURE(t) (SURF_INDEX_VEC4_SHADER_TIME + 1 + (t))
-#define BRW_MAX_VEC4_SURFACES (SURF_INDEX_VEC4_GATHER_TEXTURE(BRW_MAX_TEX_UNIT))
-
#define SURF_INDEX_GEN6_SOL_BINDING(t) (t)
#define BRW_MAX_GEN6_GS_SURFACES SURF_INDEX_GEN6_SOL_BINDING(BRW_MAX_SOL_BINDINGS)
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
index 14ba251d4fb..6689a3d3c01 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -1424,11 +1424,30 @@ vec4_visitor::emit_shader_time_write(enum shader_time_shader_type type,
void
vec4_visitor::assign_binding_table_offsets()
{
- prog_data->base.binding_table.texture_start = SURF_INDEX_VEC4_TEXTURE(0);
- prog_data->base.binding_table.ubo_start = SURF_INDEX_VEC4_UBO(0);
- prog_data->base.binding_table.shader_time_start = SURF_INDEX_VEC4_SHADER_TIME;
- prog_data->base.binding_table.gather_texture_start = SURF_INDEX_VEC4_GATHER_TEXTURE(0);
- prog_data->base.binding_table.pull_constants_start = SURF_INDEX_VEC4_CONST_BUFFER;
+ int num_textures = _mesa_fls(prog->SamplersUsed);
+ int next = 0;
+
+ prog_data->base.binding_table.texture_start = next;
+ next += num_textures;
+
+ if (shader) {
+ prog_data->base.binding_table.ubo_start = next;
+ next += shader->base.NumUniformBlocks;
+ }
+
+ if (INTEL_DEBUG & DEBUG_SHADER_TIME) {
+ prog_data->base.binding_table.shader_time_start = next;
+ next++;
+ }
+
+ if (prog->UsesGather) {
+ prog_data->base.binding_table.gather_texture_start = next;
+ next += num_textures;
+ }
+
+ /* This may or may not be used depending on how the compile goes. */
+ prog_data->base.binding_table.pull_constants_start = next;
+ next++;
/* prog_data->base.binding_table.size will be set by mark_surface_used. */
}
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
index ca5ac722bee..1b597b55861 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
@@ -155,7 +155,7 @@ vec4_generator::~vec4_generator()
void
vec4_generator::mark_surface_used(unsigned surf_index)
{
- assert(surf_index < BRW_MAX_VEC4_SURFACES);
+ assert(surf_index < BRW_MAX_SURFACES);
prog_data->base.binding_table.size_bytes =
MAX2(prog_data->base.binding_table.size_bytes, (surf_index + 1) * 4);