i965: new SURF_INDEX_ macros

Used to map drawables, textures and constant buffers to surface binding
table indexes.
This commit is contained in:
Brian Paul 2009-04-09 17:04:09 -06:00
parent 7e0d4598fb
commit 2078e6cf55
5 changed files with 49 additions and 40 deletions

View file

@ -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 {

View file

@ -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 */

View file

@ -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,

View file

@ -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 */

View file

@ -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);