mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
i965: new SURF_INDEX_ macros
Used to map drawables, textures and constant buffers to surface binding table indexes.
This commit is contained in:
parent
7e0d4598fb
commit
2078e6cf55
5 changed files with 49 additions and 40 deletions
|
|
@ -247,9 +247,18 @@ struct brw_vs_ouput_sizes {
|
|||
/**
|
||||
* Size of our surface binding table.
|
||||
* This contains pointers to the drawing surfaces and current texture
|
||||
* objects and shader constant buffer (+1).
|
||||
* objects and shader constant buffers (+2).
|
||||
*/
|
||||
#define BRW_WM_MAX_SURF (MAX_DRAW_BUFFERS + BRW_MAX_TEX_UNIT + 1)
|
||||
#define BRW_WM_MAX_SURF (MAX_DRAW_BUFFERS + BRW_MAX_TEX_UNIT + 2)
|
||||
|
||||
/**
|
||||
* Helpers to convert drawing buffers, textures and constant buffers
|
||||
* to surface binding table indexes.
|
||||
*/
|
||||
#define SURF_INDEX_DRAW(d) (d)
|
||||
#define SURF_INDEX_FRAG_CONST_BUFFER (MAX_DRAW_BUFFERS + 0)
|
||||
#define SURF_INDEX_VERT_CONST_BUFFER (MAX_DRAW_BUFFERS + 1)
|
||||
#define SURF_INDEX_TEXTURE(t) (MAX_DRAW_BUFFERS + 2 + t)
|
||||
|
||||
|
||||
enum brw_cache_id {
|
||||
|
|
|
|||
|
|
@ -990,7 +990,7 @@ void brw_dp_READ_4( struct brw_compile *p,
|
|||
brw_set_src0(insn, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UW));
|
||||
|
||||
brw_set_dp_read_message(insn,
|
||||
bind_table_index, /* binding table index (255=stateless) */
|
||||
bind_table_index,
|
||||
0, /* msg_control (0 means 1 Oword) */
|
||||
BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, /* msg_type */
|
||||
0, /* source cache = data cache */
|
||||
|
|
|
|||
|
|
@ -742,7 +742,7 @@ static void emit_tex( struct brw_wm_compile *c,
|
|||
retype(vec16(dst[0]), BRW_REGISTER_TYPE_UW),
|
||||
1,
|
||||
retype(c->payload.depth[0].hw_reg, BRW_REGISTER_TYPE_UW),
|
||||
inst->tex_unit + MAX_DRAW_BUFFERS, /* surface */
|
||||
SURF_INDEX_TEXTURE(inst->tex_unit),
|
||||
inst->tex_unit, /* sampler */
|
||||
inst->writemask,
|
||||
(inst->tex_shadow ?
|
||||
|
|
@ -791,7 +791,7 @@ static void emit_txb( struct brw_wm_compile *c,
|
|||
retype(vec16(dst[0]), BRW_REGISTER_TYPE_UW),
|
||||
1,
|
||||
retype(c->payload.depth[0].hw_reg, BRW_REGISTER_TYPE_UW),
|
||||
inst->tex_unit + MAX_DRAW_BUFFERS, /* surface */
|
||||
SURF_INDEX_TEXTURE(inst->tex_unit),
|
||||
inst->tex_unit, /* sampler */
|
||||
inst->writemask,
|
||||
BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_BIAS,
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ static void fetch_constants(struct brw_wm_compile *c,
|
|||
1, /* msg_reg */
|
||||
src->RelAddr, /* relative indexing? */
|
||||
16 * src->Index, /* byte offset */
|
||||
BRW_WM_MAX_SURF - 1 /* binding table index */
|
||||
SURF_INDEX_FRAG_CONST_BUFFER/* binding table index */
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -2498,7 +2498,7 @@ static void emit_txb(struct brw_wm_compile *c,
|
|||
retype(vec8(dst[0]), BRW_REGISTER_TYPE_UW), /* dest */
|
||||
1, /* msg_reg_nr */
|
||||
retype(payload_reg, BRW_REGISTER_TYPE_UW), /* src0 */
|
||||
unit + MAX_DRAW_BUFFERS, /* surface */
|
||||
SURF_INDEX_TEXTURE(unit),
|
||||
unit, /* sampler */
|
||||
inst->DstReg.WriteMask, /* writemask */
|
||||
BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_BIAS, /* msg_type */
|
||||
|
|
@ -2562,7 +2562,7 @@ static void emit_tex(struct brw_wm_compile *c,
|
|||
retype(vec8(dst[0]), BRW_REGISTER_TYPE_UW), /* dest */
|
||||
1, /* msg_reg_nr */
|
||||
retype(payload_reg, BRW_REGISTER_TYPE_UW), /* src0 */
|
||||
unit + MAX_DRAW_BUFFERS, /* surface */
|
||||
SURF_INDEX_TEXTURE(unit),
|
||||
unit, /* sampler */
|
||||
inst->DstReg.WriteMask, /* writemask */
|
||||
BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE, /* msg_type */
|
||||
|
|
|
|||
|
|
@ -288,7 +288,7 @@ brw_update_texture_surface( GLcontext *ctx, GLuint unit )
|
|||
struct intel_texture_object *intelObj = intel_texture_object(tObj);
|
||||
struct gl_texture_image *firstImage = tObj->Image[0][intelObj->firstLevel];
|
||||
struct brw_wm_surface_key key;
|
||||
const GLuint j = MAX_DRAW_BUFFERS + unit;
|
||||
const GLuint surf = SURF_INDEX_TEXTURE(unit);
|
||||
|
||||
memset(&key, 0, sizeof(key));
|
||||
|
||||
|
|
@ -315,13 +315,13 @@ brw_update_texture_surface( GLcontext *ctx, GLuint unit )
|
|||
key.cpp = intelObj->mt->cpp;
|
||||
key.tiling = intelObj->mt->region->tiling;
|
||||
|
||||
dri_bo_unreference(brw->wm.surf_bo[j]);
|
||||
brw->wm.surf_bo[j] = brw_search_cache(&brw->cache, BRW_SS_SURFACE,
|
||||
dri_bo_unreference(brw->wm.surf_bo[surf]);
|
||||
brw->wm.surf_bo[surf] = brw_search_cache(&brw->cache, BRW_SS_SURFACE,
|
||||
&key, sizeof(key),
|
||||
&key.bo, key.bo ? 1 : 0,
|
||||
NULL);
|
||||
if (brw->wm.surf_bo[j] == NULL) {
|
||||
brw->wm.surf_bo[j] = brw_create_texture_surface(brw, &key);
|
||||
if (brw->wm.surf_bo[surf] == NULL) {
|
||||
brw->wm.surf_bo[surf] = brw_create_texture_surface(brw, &key);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -387,7 +387,7 @@ brw_update_constant_surface( GLcontext *ctx,
|
|||
{
|
||||
struct brw_context *brw = brw_context(ctx);
|
||||
struct brw_wm_surface_key key;
|
||||
const GLuint j = BRW_WM_MAX_SURF - 1;
|
||||
const GLuint surf = SURF_INDEX_FRAG_CONST_BUFFER;
|
||||
const GLuint numParams = fp->program.Base.Parameters->NumParameters;
|
||||
|
||||
memset(&key, 0, sizeof(key));
|
||||
|
|
@ -409,13 +409,13 @@ brw_update_constant_surface( GLcontext *ctx,
|
|||
key.width, key.height, key.depth, key.cpp, key.pitch);
|
||||
*/
|
||||
|
||||
dri_bo_unreference(brw->wm.surf_bo[j]);
|
||||
brw->wm.surf_bo[j] = brw_search_cache(&brw->cache, BRW_SS_SURFACE,
|
||||
&key, sizeof(key),
|
||||
&key.bo, key.bo ? 1 : 0,
|
||||
NULL);
|
||||
if (brw->wm.surf_bo[j] == NULL) {
|
||||
brw->wm.surf_bo[j] = brw_create_constant_surface(brw, &key);
|
||||
dri_bo_unreference(brw->wm.surf_bo[surf]);
|
||||
brw->wm.surf_bo[surf] = brw_search_cache(&brw->cache, BRW_SS_SURFACE,
|
||||
&key, sizeof(key),
|
||||
&key.bo, key.bo ? 1 : 0,
|
||||
NULL);
|
||||
if (brw->wm.surf_bo[surf] == NULL) {
|
||||
brw->wm.surf_bo[surf] = brw_create_constant_surface(brw, &key);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -587,41 +587,41 @@ static void prepare_wm_surfaces(struct brw_context *brw )
|
|||
old_nr_surfaces = brw->wm.nr_surfaces;
|
||||
brw->wm.nr_surfaces = MAX_DRAW_BUFFERS;
|
||||
|
||||
/* Update surface for fragment shader constant buffer */
|
||||
{
|
||||
const GLuint surf = SURF_INDEX_FRAG_CONST_BUFFER + 1;
|
||||
const struct brw_fragment_program *fp =
|
||||
brw_fragment_program_const(brw->fragment_program);
|
||||
|
||||
brw_update_constant_surface(ctx, fp);
|
||||
brw->wm.nr_surfaces = surf + 1;
|
||||
}
|
||||
|
||||
|
||||
/* Update surfaces for textures */
|
||||
for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
|
||||
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
|
||||
const GLuint j = MAX_DRAW_BUFFERS + i;
|
||||
const GLuint surf = SURF_INDEX_TEXTURE(i);
|
||||
|
||||
/* _NEW_TEXTURE, BRW_NEW_TEXDATA */
|
||||
if (texUnit->_ReallyEnabled) {
|
||||
if (texUnit->_Current == intel->frame_buffer_texobj) {
|
||||
/* render to texture */
|
||||
dri_bo_unreference(brw->wm.surf_bo[j]);
|
||||
brw->wm.surf_bo[j] = brw->wm.surf_bo[0];
|
||||
dri_bo_reference(brw->wm.surf_bo[j]);
|
||||
brw->wm.nr_surfaces = j + 1;
|
||||
dri_bo_unreference(brw->wm.surf_bo[surf]);
|
||||
brw->wm.surf_bo[surf] = brw->wm.surf_bo[0];
|
||||
dri_bo_reference(brw->wm.surf_bo[surf]);
|
||||
brw->wm.nr_surfaces = surf + 1;
|
||||
} else {
|
||||
/* regular texture */
|
||||
brw_update_texture_surface(ctx, i);
|
||||
brw->wm.nr_surfaces = j + 1;
|
||||
brw->wm.nr_surfaces = surf + 1;
|
||||
}
|
||||
} else {
|
||||
dri_bo_unreference(brw->wm.surf_bo[j]);
|
||||
brw->wm.surf_bo[j] = NULL;
|
||||
dri_bo_unreference(brw->wm.surf_bo[surf]);
|
||||
brw->wm.surf_bo[surf] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update surface for fragment shader constant buffer */
|
||||
{
|
||||
const GLuint j = BRW_WM_MAX_SURF - 1;
|
||||
const struct brw_fragment_program *fp =
|
||||
brw_fragment_program_const(brw->fragment_program);
|
||||
|
||||
brw_update_constant_surface(ctx, fp);
|
||||
brw->wm.nr_surfaces = j + 1;
|
||||
}
|
||||
|
||||
|
||||
dri_bo_unreference(brw->wm.bind_bo);
|
||||
brw->wm.bind_bo = brw_wm_get_binding_table(brw);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue