summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers
diff options
context:
space:
mode:
authorJordan Justen <[email protected]>2014-09-06 11:48:46 -0700
committerJordan Justen <[email protected]>2014-09-22 11:11:33 -0700
commite9be6a783376142f1f3a2d2371b09f837641ceb3 (patch)
treeae33f4864a6f445844f6a4bf4f3729828546f8b7 /src/mesa/drivers
parent49e5f76a65978a6188572c0197523dd9c312ebeb (diff)
i965/fs: Use brw_sampler_prog_key_data instead of brw_wm_prog_key::tex
This helps: 1. Reduce the need to have fs_visitor::key's type be brw_wm_prog_key* 2. Align the code to allow brw_sampler_prog_key_data to be pulled out of other prog_key types for different stages. Signed-off-by: Jordan Justen <[email protected]> Reviewed-by: Anuj Phogat <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_visitor.cpp41
1 files changed, 29 insertions, 12 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index b6ab16cc8f9..bd579f11d78 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -1664,6 +1664,10 @@ fs_visitor::rescale_texcoord(ir_texture *ir, fs_reg coordinate,
fs_inst *inst = NULL;
bool needs_gl_clamp = true;
fs_reg scale_x, scale_y;
+ const struct brw_sampler_prog_key_data *tex =
+ (stage == MESA_SHADER_FRAGMENT) ?
+ &this->key->tex : NULL;
+ assert(tex);
/* The 965 requires the EU to do the normalization of GL rectangle
* texture coordinates. We use the program parameter state
@@ -1671,8 +1675,8 @@ fs_visitor::rescale_texcoord(ir_texture *ir, fs_reg coordinate,
*/
if (is_rect &&
(brw->gen < 6 ||
- (brw->gen >= 6 && (key->tex.gl_clamp_mask[0] & (1 << sampler) ||
- key->tex.gl_clamp_mask[1] & (1 << sampler))))) {
+ (brw->gen >= 6 && (tex->gl_clamp_mask[0] & (1 << sampler) ||
+ tex->gl_clamp_mask[1] & (1 << sampler))))) {
struct gl_program_parameter_list *params = prog->Parameters;
int tokens[STATE_LENGTH] = {
STATE_INTERNAL,
@@ -1733,7 +1737,7 @@ fs_visitor::rescale_texcoord(ir_texture *ir, fs_reg coordinate,
needs_gl_clamp = false;
for (int i = 0; i < 2; i++) {
- if (key->tex.gl_clamp_mask[i] & (1 << sampler)) {
+ if (tex->gl_clamp_mask[i] & (1 << sampler)) {
fs_reg chan = coordinate;
chan.reg_offset += i;
@@ -1759,7 +1763,7 @@ fs_visitor::rescale_texcoord(ir_texture *ir, fs_reg coordinate,
if (ir->coordinate && needs_gl_clamp) {
for (unsigned int i = 0;
i < MIN2(ir->coordinate->type->vector_elements, 3); i++) {
- if (key->tex.gl_clamp_mask[i] & (1 << sampler)) {
+ if (tex->gl_clamp_mask[i] & (1 << sampler)) {
fs_reg chan = coordinate;
chan.reg_offset += i;
@@ -1805,6 +1809,10 @@ fs_visitor::emit_mcs_fetch(ir_texture *ir, fs_reg coordinate, fs_reg sampler)
void
fs_visitor::visit(ir_texture *ir)
{
+ const struct brw_sampler_prog_key_data *tex =
+ (stage == MESA_SHADER_FRAGMENT) ?
+ &this->key->tex : NULL;
+ assert(tex);
fs_inst *inst = NULL;
uint32_t sampler =
@@ -1856,7 +1864,7 @@ fs_visitor::visit(ir_texture *ir)
* emitting anything other than setting up the constant result.
*/
ir_constant *chan = ir->lod_info.component->as_constant();
- int swiz = GET_SWZ(key->tex.swizzles[sampler], chan->value.i[0]);
+ int swiz = GET_SWZ(tex->swizzles[sampler], chan->value.i[0]);
if (swiz == SWIZZLE_ZERO || swiz == SWIZZLE_ONE) {
fs_reg res = fs_reg(this, glsl_type::vec4_type);
@@ -1924,7 +1932,7 @@ fs_visitor::visit(ir_texture *ir)
ir->lod_info.sample_index->accept(this);
sample_index = this->result;
- if (brw->gen >= 7 && key->tex.compressed_multisample_layout_mask & (1<<sampler))
+ if (brw->gen >= 7 && tex->compressed_multisample_layout_mask & (1<<sampler))
mcs = emit_mcs_fetch(ir, coordinate, sampler_reg);
else
mcs = fs_reg(0u);
@@ -1983,7 +1991,7 @@ fs_visitor::visit(ir_texture *ir)
}
if (brw->gen == 6 && ir->op == ir_tg4) {
- emit_gen6_gather_wa(key->tex.gen6_gather_wa[sampler], dst);
+ emit_gen6_gather_wa(tex->gen6_gather_wa[sampler], dst);
}
swizzle_result(ir, dst, sampler);
@@ -2025,15 +2033,19 @@ fs_visitor::emit_gen6_gather_wa(uint8_t wa, fs_reg dst)
uint32_t
fs_visitor::gather_channel(ir_texture *ir, uint32_t sampler)
{
+ const struct brw_sampler_prog_key_data *tex =
+ (stage == MESA_SHADER_FRAGMENT) ?
+ &this->key->tex : NULL;
+ assert(tex);
ir_constant *chan = ir->lod_info.component->as_constant();
- int swiz = GET_SWZ(key->tex.swizzles[sampler], chan->value.i[0]);
+ int swiz = GET_SWZ(tex->swizzles[sampler], chan->value.i[0]);
switch (swiz) {
case SWIZZLE_X: return 0;
case SWIZZLE_Y:
/* gather4 sampler is broken for green channel on RG32F --
* we must ask for blue instead.
*/
- if (key->tex.gather_channel_quirk_mask & (1<<sampler))
+ if (tex->gather_channel_quirk_mask & (1<<sampler))
return 2;
return 1;
case SWIZZLE_Z: return 2;
@@ -2065,14 +2077,19 @@ fs_visitor::swizzle_result(ir_texture *ir, fs_reg orig_val, uint32_t sampler)
if (ir->op == ir_txs || ir->op == ir_lod || ir->op == ir_tg4)
return;
+ const struct brw_sampler_prog_key_data *tex =
+ (stage == MESA_SHADER_FRAGMENT) ?
+ &this->key->tex : NULL;
+ assert(tex);
+
if (ir->type == glsl_type::float_type) {
/* Ignore DEPTH_TEXTURE_MODE swizzling. */
assert(ir->sampler->type->sampler_shadow);
- } else if (key->tex.swizzles[sampler] != SWIZZLE_NOOP) {
+ } else if (tex->swizzles[sampler] != SWIZZLE_NOOP) {
fs_reg swizzled_result = fs_reg(this, glsl_type::vec4_type);
for (int i = 0; i < 4; i++) {
- int swiz = GET_SWZ(key->tex.swizzles[sampler], i);
+ int swiz = GET_SWZ(tex->swizzles[sampler], i);
fs_reg l = swizzled_result;
l.reg_offset += i;
@@ -2082,7 +2099,7 @@ fs_visitor::swizzle_result(ir_texture *ir, fs_reg orig_val, uint32_t sampler)
emit(MOV(l, fs_reg(1.0f)));
} else {
fs_reg r = orig_val;
- r.reg_offset += GET_SWZ(key->tex.swizzles[sampler], i);
+ r.reg_offset += GET_SWZ(tex->swizzles[sampler], i);
emit(MOV(l, r));
}
}