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