From: Eric Anholt Date: Thu, 3 Oct 2013 01:53:04 +0000 (-0700) Subject: i965/fs: Dynamically set up the WM binding table offsets. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4e5306453da6a1c076309e543ec92d999e02f67a;p=mesa.git i965/fs: Dynamically set up the WM binding table offsets. Reviewed-by: Paul Berry --- diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 222fdc2d0b0..4e26460267b 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -689,33 +689,6 @@ struct brw_gs_prog_data * For example, a shader might ask to sample from "surface 7." In this case, * bind[7] would contain a pointer to a texture. * - * Currently, our WM binding tables are (arbitrarily) programmed as follows: - * - * +-------------------------------+ - * | 0 | Draw buffer 0 | - * | . | . | - * | : | : | - * | 7 | Draw buffer 7 | - * |-----|-------------------------| - * | 8 | WM Pull Constant Buffer | - * |-----|-------------------------| - * | 9 | Texture 0 | - * | . | . | - * | : | : | - * | 24 | Texture 15 | - * |-----|-------------------------| - * | 25 | UBO 0 | - * | . | . | - * | : | : | - * | 36 | UBO 11 | - * |-----|-------------------------| - * | 37 | Shader time buffer | - * |-----|-------------------------| - * | 38 | Gather texture 0 | - * | . | . | - * | : | : | - * | 53 | Gather texture 15 | - * +-------------------------------+ * * Our VS (and Gen7 GS) binding tables are programmed as follows: * @@ -749,14 +722,10 @@ struct brw_gs_prog_data * | 63 | SOL Binding 63 | * +-----+-------------------------+ */ -#define SURF_INDEX_DRAW(d) (d) -#define SURF_INDEX_FRAG_CONST_BUFFER (BRW_MAX_DRAW_BUFFERS + 1) -#define SURF_INDEX_TEXTURE(t) (BRW_MAX_DRAW_BUFFERS + 2 + (t)) -#define SURF_INDEX_WM_UBO(u) (SURF_INDEX_TEXTURE(BRW_MAX_TEX_UNIT) + u) -#define SURF_INDEX_WM_SHADER_TIME (SURF_INDEX_WM_UBO(12)) -#define SURF_INDEX_GATHER_TEXTURE(t) (SURF_INDEX_WM_SHADER_TIME + 1 + (t)) -/** Maximum size of the binding table. */ -#define BRW_MAX_WM_SURFACES (SURF_INDEX_GATHER_TEXTURE(BRW_MAX_TEX_UNIT)) +#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)) @@ -985,7 +954,7 @@ struct brw_stage_state /* Binding table: pointers to SURFACE_STATE entries. */ uint32_t bind_bo_offset; - uint32_t surf_offset[BRW_MAX_WM_SURFACES]; + uint32_t surf_offset[BRW_MAX_SURFACES]; /** SAMPLER_STATE count and table offset */ uint32_t sampler_count; diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 265b4aaa050..4d83c079c98 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -2981,12 +2981,35 @@ fs_visitor::setup_payload_gen6() void fs_visitor::assign_binding_table_offsets() { - c->prog_data.binding_table.render_target_start = SURF_INDEX_DRAW(0); - c->prog_data.base.binding_table.texture_start = SURF_INDEX_TEXTURE(0); - c->prog_data.base.binding_table.ubo_start = SURF_INDEX_WM_UBO(0); - c->prog_data.base.binding_table.shader_time_start = SURF_INDEX_WM_SHADER_TIME; - c->prog_data.base.binding_table.gather_texture_start = SURF_INDEX_GATHER_TEXTURE(0); - c->prog_data.base.binding_table.pull_constants_start = SURF_INDEX_FRAG_CONST_BUFFER; + int num_textures = _mesa_fls(fp->Base.SamplersUsed); + int next = 0; + + c->prog_data.binding_table.render_target_start = next; + next += c->key.nr_color_regions; + + c->prog_data.base.binding_table.texture_start = next; + next += num_textures; + + if (shader) { + c->prog_data.base.binding_table.ubo_start = next; + next += shader->base.NumUniformBlocks; + } + + if (INTEL_DEBUG & DEBUG_SHADER_TIME) { + c->prog_data.base.binding_table.shader_time_start = next; + next++; + } + + if (fp->Base.UsesGather) { + c->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. */ + c->prog_data.base.binding_table.pull_constants_start = next; + next++; + + assert(next < BRW_MAX_SURFACES); /* c->prog_data.base.binding_table.size will be set by mark_surface_used. */ } diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp index 05145d08808..fa15f7bac20 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp @@ -61,7 +61,7 @@ fs_generator::~fs_generator() void fs_generator::mark_surface_used(unsigned surf_index) { - assert(surf_index < BRW_MAX_WM_SURFACES); + assert(surf_index < BRW_MAX_SURFACES); c->prog_data.base.binding_table.size_bytes = MAX2(c->prog_data.base.binding_table.size_bytes, (surf_index + 1) * 4);