mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 06:30:10 +01:00
i965/fs: Dynamically set up the WM binding table offsets.
Reviewed-by: Paul Berry <stereotype441@gmail.com>
This commit is contained in:
parent
3c9dc2d31b
commit
4e5306453d
3 changed files with 35 additions and 43 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue