Browse Source

i965/fs: Factor out texture offset bitfield computation.

We'll want to reuse this for the VS, and it's complex enough that I'd
rather not cut and paste it.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
tags/mesa-8.0-rc1
Kenneth Graunke 14 years ago
parent
commit
475d70d6ef

+ 1
- 18
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp View File

@@ -1077,24 +1077,7 @@ fs_visitor::visit(ir_texture *ir)
fs_reg coordinate = this->result;

if (ir->offset != NULL) {
ir_constant *offset = ir->offset->as_constant();
assert(offset != NULL);

signed char offsets[3];
for (unsigned i = 0; i < ir->offset->type->vector_elements; i++)
offsets[i] = (signed char) offset->value.i[i];

/* Combine all three offsets into a single unsigned dword:
*
* bits 11:8 - U Offset (X component)
* bits 7:4 - V Offset (Y component)
* bits 3:0 - R Offset (Z component)
*/
unsigned offset_bits = 0;
for (unsigned i = 0; i < ir->offset->type->vector_elements; i++) {
const unsigned shift = 4 * (2 - i);
offset_bits |= (offsets[i] << shift) & (0xF << shift);
}
uint32_t offset_bits = brw_texture_offset(ir->offset->as_constant());

/* Explicitly set up the message header by copying g0 to msg reg m1. */
emit(BRW_OPCODE_MOV, fs_reg(MRF, 1, BRW_REGISTER_TYPE_UD),

+ 23
- 0
src/mesa/drivers/dri/i965/brw_shader.cpp View File

@@ -239,3 +239,26 @@ brw_math_function(enum opcode op)
return 0;
}
}

uint32_t
brw_texture_offset(ir_constant *offset)
{
assert(offset != NULL);

signed char offsets[3];
for (unsigned i = 0; i < offset->type->vector_elements; i++)
offsets[i] = (signed char) offset->value.i[i];

/* Combine all three offsets into a single unsigned dword:
*
* bits 11:8 - U Offset (X component)
* bits 7:4 - V Offset (Y component)
* bits 3:0 - R Offset (Z component)
*/
unsigned offset_bits = 0;
for (unsigned i = 0; i < offset->type->vector_elements; i++) {
const unsigned shift = 4 * (2 - i);
offset_bits |= (offsets[i] << shift) & (0xF << shift);
}
return offset_bits;
}

+ 2
- 0
src/mesa/drivers/dri/i965/brw_shader.h View File

@@ -23,9 +23,11 @@

#include <stdint.h>
#include "brw_defines.h"
#include "glsl/ir.h"

#pragma once

int brw_type_for_base_type(const struct glsl_type *type);
uint32_t brw_conditional_for_comparison(unsigned int op);
uint32_t brw_math_function(enum opcode op);
uint32_t brw_texture_offset(ir_constant *offset);

Loading…
Cancel
Save