summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Whitwell <keithw@vmware.com>2009-11-21 01:52:22 +0000
committerKeith Whitwell <keithw@vmware.com>2009-11-21 01:52:22 +0000
commit8bf75f28de161173d1cdaad8c74bcac074e1211e (patch)
tree5a9b3887c2d75612f07b43faa3cd6ed1fd0a273d
parent95d7aca4b9963820e7ead81830340dbeb563897b (diff)
i965g: get basic texturing working again
Revert to fixed-layout surface binding table -- it's probably the best way to do this. Pass sampler and texture numbers separately even though we're always keeping them the same at present.
-rw-r--r--src/gallium/drivers/i965/brw_context.h13
-rw-r--r--src/gallium/drivers/i965/brw_pipe_fb.c4
-rw-r--r--src/gallium/drivers/i965/brw_pipe_sampler.c3
-rw-r--r--src/gallium/drivers/i965/brw_sf.c3
-rw-r--r--src/gallium/drivers/i965/brw_wm.c9
-rw-r--r--src/gallium/drivers/i965/brw_wm.h4
-rw-r--r--src/gallium/drivers/i965/brw_wm_emit.c34
-rw-r--r--src/gallium/drivers/i965/brw_wm_fp.c39
-rw-r--r--src/gallium/drivers/i965/brw_wm_surface_state.c74
9 files changed, 117 insertions, 66 deletions
diff --git a/src/gallium/drivers/i965/brw_context.h b/src/gallium/drivers/i965/brw_context.h
index 096c8cf12b..598e747fe0 100644
--- a/src/gallium/drivers/i965/brw_context.h
+++ b/src/gallium/drivers/i965/brw_context.h
@@ -209,9 +209,9 @@ struct brw_fragment_shader {
struct brw_sampler {
- float border_color[4];
struct brw_ss0 ss0;
struct brw_ss1 ss1;
+ float border_color[4];
struct brw_ss3 ss3;
};
@@ -355,20 +355,23 @@ struct brw_vs_ouput_sizes {
/** Number of texture sampler units */
#define BRW_MAX_TEX_UNIT 16
+/** Max number of render targets in a shader */
+#define BRW_MAX_DRAW_BUFFERS 4
+
/**
* Size of our surface binding table for the WM.
* This contains pointers to the drawing surfaces and current texture
* objects and shader constant buffers (+2).
*/
-#define BRW_WM_MAX_SURF (PIPE_MAX_COLOR_BUFS + BRW_MAX_TEX_UNIT + 1)
+#define BRW_WM_MAX_SURF (BRW_MAX_DRAW_BUFFERS + BRW_MAX_TEX_UNIT + 1)
/**
* Helpers to convert drawing buffers, textures and constant buffers
* to surface binding table indexes, for WM.
*/
-#define SURF_INDEX_DRAW(d) (d)
-#define SURF_INDEX_FRAG_CONST_BUFFER (PIPE_MAX_COLOR_BUFS)
-#define SURF_INDEX_TEXTURE(t) (PIPE_MAX_COLOR_BUFS + 1 + (t))
+#define BTI_COLOR_BUF(d) (d)
+#define BTI_FRAGMENT_CONSTANTS (BRW_MAX_DRAW_BUFFERS)
+#define BTI_TEXTURE(t) (BRW_MAX_DRAW_BUFFERS + 1 + (t))
/**
* Size of surface binding table for the VS.
diff --git a/src/gallium/drivers/i965/brw_pipe_fb.c b/src/gallium/drivers/i965/brw_pipe_fb.c
index 1511220447..6b03094f50 100644
--- a/src/gallium/drivers/i965/brw_pipe_fb.c
+++ b/src/gallium/drivers/i965/brw_pipe_fb.c
@@ -31,7 +31,7 @@ static void brw_set_framebuffer_state( struct pipe_context *pipe,
/* Color buffers:
*/
- for (i = 0; i < MAX2(fb->nr_cbufs, brw->curr.fb.nr_cbufs); i++) {
+ for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
if (brw->curr.fb.cbufs[i] != fb->cbufs[i]) {
brw->state.dirty.mesa |= PIPE_NEW_COLOR_BUFFERS;
pipe_surface_reference(&brw->curr.fb.cbufs[i], fb->cbufs[i]);
@@ -39,7 +39,7 @@ static void brw_set_framebuffer_state( struct pipe_context *pipe,
}
if (brw->curr.fb.nr_cbufs != fb->nr_cbufs) {
- brw->curr.fb.nr_cbufs = fb->nr_cbufs;
+ brw->curr.fb.nr_cbufs = MIN2(BRW_MAX_DRAW_BUFFERS, fb->nr_cbufs);
brw->state.dirty.mesa |= PIPE_NEW_NR_CBUFS;
}
}
diff --git a/src/gallium/drivers/i965/brw_pipe_sampler.c b/src/gallium/drivers/i965/brw_pipe_sampler.c
index f0a765ecf5..5cd38a43a6 100644
--- a/src/gallium/drivers/i965/brw_pipe_sampler.c
+++ b/src/gallium/drivers/i965/brw_pipe_sampler.c
@@ -107,7 +107,7 @@ static void *
brw_create_sampler_state( struct pipe_context *pipe,
const struct pipe_sampler_state *template )
{
- struct brw_sampler_state *sampler = CALLOC_STRUCT(brw_sampler_state);
+ struct brw_sampler *sampler = CALLOC_STRUCT(brw_sampler);
sampler->ss0.min_filter = translate_img_filter( template->min_img_filter );
sampler->ss0.mag_filter = translate_img_filter( template->mag_img_filter );
@@ -214,7 +214,6 @@ void brw_pipe_sampler_init( struct brw_context *brw )
brw->base.set_sampler_textures = brw_set_sampler_textures;
}
-
void brw_pipe_sampler_cleanup( struct brw_context *brw )
{
}
diff --git a/src/gallium/drivers/i965/brw_sf.c b/src/gallium/drivers/i965/brw_sf.c
index e1986a9dbb..a28fb71589 100644
--- a/src/gallium/drivers/i965/brw_sf.c
+++ b/src/gallium/drivers/i965/brw_sf.c
@@ -153,9 +153,10 @@ static enum pipe_error upload_sf_prog(struct brw_context *brw)
case TGSI_INTERPOLATE_CONSTANT:
break;
case TGSI_INTERPOLATE_LINEAR:
+ case TGSI_INTERPOLATE_PERSPECTIVE:
key.linear_attrs |= 1 << (i+1);
break;
- case TGSI_INTERPOLATE_PERSPECTIVE:
+// case TGSI_INTERPOLATE_PERSPECTIVE:
key.persp_attrs |= 1 << (i+1);
break;
}
diff --git a/src/gallium/drivers/i965/brw_wm.c b/src/gallium/drivers/i965/brw_wm.c
index 3c5a2dab7a..2c9d3e5e87 100644
--- a/src/gallium/drivers/i965/brw_wm.c
+++ b/src/gallium/drivers/i965/brw_wm.c
@@ -56,6 +56,15 @@ GLuint brw_wm_nr_args( GLuint opcode )
case WM_FB_WRITE:
case WM_PINTERP:
return 3;
+ case TGSI_OPCODE_TEX:
+ case TGSI_OPCODE_TXP:
+ case TGSI_OPCODE_TXB:
+ case TGSI_OPCODE_TXD:
+ /* sampler arg is held as a field in the instruction, not in an
+ * actual register:
+ */
+ return tgsi_get_opcode_info(opcode)->num_src - 1;
+
default:
assert(opcode < MAX_OPCODE);
return tgsi_get_opcode_info(opcode)->num_src;
diff --git a/src/gallium/drivers/i965/brw_wm.h b/src/gallium/drivers/i965/brw_wm.h
index b7d807dcb3..f1ca9f6369 100644
--- a/src/gallium/drivers/i965/brw_wm.h
+++ b/src/gallium/drivers/i965/brw_wm.h
@@ -135,6 +135,7 @@ struct brw_wm_instruction {
GLuint opcode:8;
GLuint saturate:1;
GLuint writemask:4;
+ GLuint sampler:4;
GLuint tex_unit:4; /* texture/sampler unit for texture instructions */
GLuint target:4; /* TGSI_TEXTURE_x for texture instructions,
* target binding table index for FB_WRITE
@@ -201,7 +202,8 @@ struct brw_fp_instruction {
unsigned opcode:8;
unsigned target:8; /* XXX: special usage for FB_WRITE */
unsigned tex_unit:4;
- unsigned pad:12;
+ unsigned sampler:4;
+ unsigned pad:8;
};
diff --git a/src/gallium/drivers/i965/brw_wm_emit.c b/src/gallium/drivers/i965/brw_wm_emit.c
index a14e12f35b..3250db1848 100644
--- a/src/gallium/drivers/i965/brw_wm_emit.c
+++ b/src/gallium/drivers/i965/brw_wm_emit.c
@@ -792,7 +792,8 @@ static void emit_tex( struct brw_wm_compile *c,
const struct brw_wm_instruction *inst,
struct brw_reg *dst,
GLuint dst_flags,
- struct brw_reg *arg )
+ struct brw_reg *coord,
+ GLuint sampler)
{
struct brw_compile *p = &c->func;
GLuint msgLength, responseLength;
@@ -838,7 +839,7 @@ static void emit_tex( struct brw_wm_compile *c,
for (i = 0; i < nr; i++) {
static const GLuint swz[4] = {0,1,2,2};
if (emit & (1<<i))
- brw_MOV(p, brw_message_reg(msgLength+1), arg[swz[i]]);
+ brw_MOV(p, brw_message_reg(msgLength+1), coord[swz[i]]);
else
brw_MOV(p, brw_message_reg(msgLength+1), brw_imm_f(0));
msgLength += 2;
@@ -862,8 +863,8 @@ 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),
- SURF_INDEX_TEXTURE(inst->tex_unit),
- inst->tex_unit, /* sampler */
+ BTI_TEXTURE(inst->tex_unit),
+ sampler, /* sampler index */
inst->writemask,
msg_type,
responseLength,
@@ -878,7 +879,8 @@ static void emit_txb( struct brw_wm_compile *c,
const struct brw_wm_instruction *inst,
struct brw_reg *dst,
GLuint dst_flags,
- struct brw_reg *arg )
+ struct brw_reg *coord,
+ GLuint sampler )
{
struct brw_compile *p = &c->func;
GLuint msgLength;
@@ -888,7 +890,7 @@ static void emit_txb( struct brw_wm_compile *c,
switch (inst->target) {
case TGSI_TEXTURE_1D:
case TGSI_TEXTURE_SHADOW1D:
- brw_MOV(p, brw_message_reg(2), arg[0]);
+ brw_MOV(p, brw_message_reg(2), coord[0]);
brw_MOV(p, brw_message_reg(4), brw_imm_f(0));
brw_MOV(p, brw_message_reg(6), brw_imm_f(0));
break;
@@ -896,22 +898,22 @@ static void emit_txb( struct brw_wm_compile *c,
case TGSI_TEXTURE_RECT:
case TGSI_TEXTURE_SHADOW2D:
case TGSI_TEXTURE_SHADOWRECT:
- brw_MOV(p, brw_message_reg(2), arg[0]);
- brw_MOV(p, brw_message_reg(4), arg[1]);
+ brw_MOV(p, brw_message_reg(2), coord[0]);
+ brw_MOV(p, brw_message_reg(4), coord[1]);
brw_MOV(p, brw_message_reg(6), brw_imm_f(0));
break;
case TGSI_TEXTURE_3D:
case TGSI_TEXTURE_CUBE:
- brw_MOV(p, brw_message_reg(2), arg[0]);
- brw_MOV(p, brw_message_reg(4), arg[1]);
- brw_MOV(p, brw_message_reg(6), arg[2]);
+ brw_MOV(p, brw_message_reg(2), coord[0]);
+ brw_MOV(p, brw_message_reg(4), coord[1]);
+ brw_MOV(p, brw_message_reg(6), coord[2]);
break;
default:
/* unexpected target */
abort();
}
- brw_MOV(p, brw_message_reg(8), arg[3]);
+ brw_MOV(p, brw_message_reg(8), coord[3]);
msgLength = 9;
if (BRW_IS_IGDNG(p->brw))
@@ -923,8 +925,8 @@ 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),
- SURF_INDEX_TEXTURE(inst->tex_unit),
- inst->tex_unit, /* sampler */
+ BTI_TEXTURE(inst->tex_unit),
+ sampler, /* sampler index */
inst->writemask,
msg_type,
8, /* responseLength */
@@ -1483,11 +1485,11 @@ void brw_wm_emit( struct brw_wm_compile *c )
/* Texturing operations:
*/
case TGSI_OPCODE_TEX:
- emit_tex(c, inst, dst, dst_flags, args[0]);
+ emit_tex(c, inst, dst, dst_flags, args[0], inst->sampler);
break;
case TGSI_OPCODE_TXB:
- emit_txb(c, inst, dst, dst_flags, args[0]);
+ emit_txb(c, inst, dst, dst_flags, args[0], inst->sampler);
break;
case TGSI_OPCODE_KIL:
diff --git a/src/gallium/drivers/i965/brw_wm_fp.c b/src/gallium/drivers/i965/brw_wm_fp.c
index 174486a101..a8b5e15f36 100644
--- a/src/gallium/drivers/i965/brw_wm_fp.c
+++ b/src/gallium/drivers/i965/brw_wm_fp.c
@@ -282,6 +282,7 @@ static struct brw_fp_instruction * emit_tex_op(struct brw_wm_compile *c,
struct brw_fp_dst dest,
GLuint tex_unit,
GLuint target,
+ GLuint sampler,
struct brw_fp_src src0,
struct brw_fp_src src1,
struct brw_fp_src src2 )
@@ -298,6 +299,7 @@ static struct brw_fp_instruction * emit_tex_op(struct brw_wm_compile *c,
inst->dst = dest;
inst->tex_unit = tex_unit;
inst->target = target;
+ inst->sampler = sampler;
inst->src[0] = src0;
inst->src[1] = src1;
inst->src[2] = src2;
@@ -313,7 +315,7 @@ static INLINE void emit_op3(struct brw_wm_compile *c,
struct brw_fp_src src1,
struct brw_fp_src src2 )
{
- emit_tex_op(c, op, dest, 0, 0, src0, src1, src2);
+ emit_tex_op(c, op, dest, 0, 0, 0, src0, src1, src2);
}
@@ -323,7 +325,7 @@ static INLINE void emit_op2(struct brw_wm_compile *c,
struct brw_fp_src src0,
struct brw_fp_src src1)
{
- emit_tex_op(c, op, dest, 0, 0, src0, src1, src_undef());
+ emit_tex_op(c, op, dest, 0, 0, 0, src0, src1, src_undef());
}
static INLINE void emit_op1(struct brw_wm_compile *c,
@@ -331,14 +333,14 @@ static INLINE void emit_op1(struct brw_wm_compile *c,
struct brw_fp_dst dest,
struct brw_fp_src src0)
{
- emit_tex_op(c, op, dest, 0, 0, src0, src_undef(), src_undef());
+ emit_tex_op(c, op, dest, 0, 0, 0, src0, src_undef(), src_undef());
}
static INLINE void emit_op0(struct brw_wm_compile *c,
GLuint op,
struct brw_fp_dst dest)
{
- emit_tex_op(c, op, dest, 0, 0, src_undef(), src_undef(), src_undef());
+ emit_tex_op(c, op, dest, 0, 0, 0, src_undef(), src_undef(), src_undef());
}
@@ -674,7 +676,8 @@ static void precalc_tex( struct brw_wm_compile *c,
struct brw_fp_dst dst,
unsigned target,
unsigned unit,
- struct brw_fp_src src0 )
+ struct brw_fp_src src0,
+ struct brw_fp_src sampler )
{
struct brw_fp_src coord = src_undef();
struct brw_fp_dst tmp = dst_undef();
@@ -751,6 +754,7 @@ static void precalc_tex( struct brw_wm_compile *c,
dst_saturate(tmp, dst.saturate),
unit,
target,
+ sampler.index,
coord,
src_undef(),
src_undef());
@@ -802,6 +806,7 @@ static void precalc_tex( struct brw_wm_compile *c,
dst,
unit,
target,
+ sampler.index,
coord,
src_undef(),
src_undef());
@@ -851,7 +856,8 @@ static void precalc_txp( struct brw_wm_compile *c,
struct brw_fp_dst dst,
unsigned target,
unsigned unit,
- struct brw_fp_src src0 )
+ struct brw_fp_src src0,
+ struct brw_fp_src sampler )
{
if (projtex(c, target, src0)) {
struct brw_fp_dst tmp = get_temp(c);
@@ -877,7 +883,8 @@ static void precalc_txp( struct brw_wm_compile *c,
dst,
target,
unit,
- src_reg_from_dst(tmp));
+ src_reg_from_dst(tmp),
+ sampler );
release_temp(c, tmp);
}
@@ -885,7 +892,7 @@ static void precalc_txp( struct brw_wm_compile *c,
{
/* dst = TEX src0
*/
- precalc_tex(c, dst, target, unit, src0);
+ precalc_tex(c, dst, target, unit, src0, sampler);
}
}
@@ -936,6 +943,7 @@ static void emit_fb_write( struct brw_wm_compile *c )
dst_undef(),
(i == c->key.nr_cbufs - 1), /* EOT */
i,
+ 0, /* no sampler */
outcolor,
payload_r0_depth,
outdepth);
@@ -1056,15 +1064,17 @@ static void emit_insn( struct brw_wm_compile *c,
case TGSI_OPCODE_TEX:
precalc_tex(c, dst,
inst->InstructionExtTexture.Texture,
- src[0].file, /* sampler unit */
- src[1] );
+ src[1].index, /* use sampler unit for tex idx */
+ src[0], /* coord */
+ src[1]); /* sampler */
break;
case TGSI_OPCODE_TXP:
precalc_txp(c, dst,
inst->InstructionExtTexture.Texture,
- src[0].file, /* sampler unit */
- src[1] );
+ src[1].index, /* use sampler unit for tex idx */
+ src[0], /* coord */
+ src[1]); /* sampler */
break;
case TGSI_OPCODE_TXB:
@@ -1072,8 +1082,9 @@ static void emit_insn( struct brw_wm_compile *c,
*/
precalc_tex(c, dst,
inst->InstructionExtTexture.Texture,
- src[0].file, /* sampler unit */
- src[1] );
+ src[1].index, /* use sampler unit for tex idx*/
+ src[0],
+ src[1]);
break;
case TGSI_OPCODE_XPD:
diff --git a/src/gallium/drivers/i965/brw_wm_surface_state.c b/src/gallium/drivers/i965/brw_wm_surface_state.c
index f882331433..f92b8198ed 100644
--- a/src/gallium/drivers/i965/brw_wm_surface_state.c
+++ b/src/gallium/drivers/i965/brw_wm_surface_state.c
@@ -149,19 +149,23 @@ brw_wm_get_binding_table(struct brw_context *brw,
enum pipe_error ret;
struct brw_winsys_reloc reloc[BRW_WM_MAX_SURF];
uint32_t data[BRW_WM_MAX_SURF];
+ GLuint nr_relocs = 0;
GLuint data_size = brw->wm.nr_surfaces * sizeof data[0];
int i;
assert(brw->wm.nr_surfaces <= BRW_WM_MAX_SURF);
assert(brw->wm.nr_surfaces > 0);
- /* Emit binding table relocations to surface state */
+ /* Emit binding table relocations to surface state
+ */
for (i = 0; i < brw->wm.nr_surfaces; i++) {
- make_reloc(&reloc[i],
- BRW_USAGE_STATE,
- 0,
- i * sizeof(GLuint),
- brw->wm.surf_bo[i]);
+ if (brw->wm.surf_bo[i]) {
+ make_reloc(&reloc[nr_relocs++],
+ BRW_USAGE_STATE,
+ 0,
+ i * sizeof(GLuint),
+ brw->wm.surf_bo[i]);
+ }
}
/* Note there is no key for this search beyond the values in the
@@ -169,7 +173,7 @@ brw_wm_get_binding_table(struct brw_context *brw,
*/
if (brw_search_cache(&brw->surface_cache, BRW_SS_SURF_BIND,
NULL, 0,
- reloc, brw->wm.nr_surfaces,
+ reloc, nr_relocs,
NULL,
bo_out))
return PIPE_OK;
@@ -182,7 +186,7 @@ brw_wm_get_binding_table(struct brw_context *brw,
ret = brw_upload_cache( &brw->surface_cache, BRW_SS_SURF_BIND,
NULL, 0,
- reloc, brw->wm.nr_surfaces,
+ reloc, nr_relocs,
data, data_size,
NULL, NULL,
bo_out);
@@ -208,40 +212,60 @@ static enum pipe_error prepare_wm_surfaces(struct brw_context *brw )
for (i = 0; i < brw->curr.fb.nr_cbufs; i++) {
ret = brw_update_render_surface(brw,
brw_surface(brw->curr.fb.cbufs[i]),
- &brw->wm.surf_bo[nr_surfaces++]);
+ &brw->wm.surf_bo[BTI_COLOR_BUF(i)]);
if (ret)
return ret;
+
+ nr_surfaces = BTI_COLOR_BUF(i) + 1;
+ }
+
+
+
+ /* PIPE_NEW_FRAGMENT_CONSTANTS
+ */
+#if 0
+ if (brw->curr.fragment_constants) {
+ ret = brw_update_fragment_constant_surface(
+ brw,
+ brw->curr.fragment_constants,
+ &brw->wm.surf_bo[BTI_FRAGMENT_CONSTANTS]);
+
+ if (ret)
+ return ret;
+
+ nr_surfaces = BTI_FRAGMENT_CONSTANTS + 1;
}
+ else {
+ bo_reference(&brw->wm.surf_bo[SURF_FRAG_CONSTANTS], NULL);
+ }
+#endif
+
/* PIPE_NEW_TEXTURE
*/
for (i = 0; i < brw->curr.num_textures; i++) {
ret = brw_update_texture_surface(brw,
brw_texture(brw->curr.texture[i]),
- &brw->wm.surf_bo[nr_surfaces++]);
+ &brw->wm.surf_bo[BTI_TEXTURE(i)]);
if (ret)
return ret;
+
+ nr_surfaces = BTI_TEXTURE(i) + 1;
}
- /* PIPE_NEW_FRAGMENT_CONSTANTS
+ /* Clear any inactive entries:
*/
-#if 0
- if (brw->curr.fragment_constants) {
- ret = brw_update_fragment_constant_surface(brw,
- brw->curr.fragment_constants,
- &brw->wm.surf_bo[nr_surfaces++]);
- if (ret)
- return ret;
- }
-#endif
+ for (i = brw->curr.fb.nr_cbufs; i < BRW_MAX_DRAW_BUFFERS; i++)
+ bo_reference(&brw->wm.surf_bo[BTI_COLOR_BUF(i)], NULL);
- if (brw->wm.nr_surfaces != nr_surfaces) {
+ if (!brw->curr.fragment_constants)
+ bo_reference(&brw->wm.surf_bo[BTI_FRAGMENT_CONSTANTS], NULL);
- /* Unreference any left-over old buffers
- */
- for (i = nr_surfaces; i < brw->wm.nr_surfaces; i++)
- bo_reference(&brw->wm.surf_bo[i], NULL);
+ /* XXX: no pipe_max_textures define?? */
+ for (i = brw->curr.num_textures; i < PIPE_MAX_SAMPLERS; i++)
+ bo_reference(&brw->wm.surf_bo[BTI_TEXTURE(i)], NULL);
+ if (brw->wm.nr_surfaces != nr_surfaces) {
brw->wm.nr_surfaces = nr_surfaces;
brw->state.dirty.brw |= BRW_NEW_NR_WM_SURFACES;
}