tgsi: initial texturing support on sse path

Most obvious problem is drawpixels comes out blocky, but this may be
an existing issue of KIL on the sse path.
This commit is contained in:
Keith Whitwell
2009-07-16 11:01:19 +01:00
parent a01383ff6a
commit 3858f47994
2 changed files with 184 additions and 19 deletions
+183 -19
View File
@@ -101,7 +101,7 @@ get_const_base( void )
{
return x86_make_reg(
file_REG32,
reg_CX );
reg_AX );
}
static struct x86_reg
@@ -109,7 +109,7 @@ get_machine_base( void )
{
return x86_make_reg(
file_REG32,
reg_AX );
reg_CX );
}
static struct x86_reg
@@ -144,6 +144,14 @@ get_coef_base( void )
reg_BX );
}
static struct x86_reg
get_sampler_base( void )
{
return x86_make_reg(
file_REG32,
reg_DI );
}
static struct x86_reg
get_immediate_base( void )
{
@@ -178,6 +186,15 @@ get_const(
(vec * 4 + chan) * 4 );
}
static struct x86_reg
get_sampler_ptr(
unsigned unit )
{
return x86_make_disp(
get_sampler_base(),
unit * sizeof( struct tgsi_sampler * ) );
}
static struct x86_reg
get_input(
unsigned vec,
@@ -1222,6 +1239,12 @@ emit_sub(
make_xmm( xmm_src ) );
}
/**
* Register fetch.
*/
@@ -1380,10 +1403,155 @@ emit_store(
#define STORE( FUNC, INST, XMM, INDEX, CHAN )\
emit_store( FUNC, XMM, &(INST).FullDstRegisters[INDEX], &(INST), CHAN )
static void PIPE_CDECL
fetch_texel( struct tgsi_sampler **sampler,
float *store )
{
#if 0
uint j;
debug_printf("%s sampler: %p (%p) store: %p\n",
__FUNCTION__,
sampler, *sampler,
store );
debug_printf("lodbias %f\n", store[12]);
for (j = 0; j < 4; j++)
debug_printf("sample %d texcoord %f %f\n",
j,
store[0+j],
store[4+j]);
#endif
{
float rgba[NUM_CHANNELS][QUAD_SIZE];
(*sampler)->get_samples(*sampler,
&store[0],
&store[4],
&store[8],
0.0f, /*store[12], lodbias */
rgba);
memcpy( store, rgba, 16 * sizeof(float));
}
#if 0
for (j = 0; j < 4; j++)
debug_printf("sample %d result %f %f %f %f\n",
j,
store[0+j],
store[4+j],
store[8+j],
store[12+j]);
#endif
}
/**
* High-level instruction translators.
*/
static void
emit_tex( struct x86_function *func,
const struct tgsi_full_instruction *inst,
boolean lodbias,
boolean projected)
{
const uint unit = inst->FullSrcRegisters[1].SrcRegister.Index;
struct x86_reg args[2];
unsigned count;
unsigned i;
switch (inst->InstructionExtTexture.Texture) {
case TGSI_TEXTURE_1D:
case TGSI_TEXTURE_SHADOW1D:
count = 1;
break;
case TGSI_TEXTURE_2D:
case TGSI_TEXTURE_RECT:
case TGSI_TEXTURE_SHADOW2D:
case TGSI_TEXTURE_SHADOWRECT:
count = 2;
break;
case TGSI_TEXTURE_3D:
case TGSI_TEXTURE_CUBE:
count = 3;
break;
default:
assert(0);
return;
}
if (lodbias) {
FETCH( func, *inst, 3, 0, 3 );
}
else {
emit_tempf(
func,
3,
TGSI_EXEC_TEMP_00000000_I,
TGSI_EXEC_TEMP_00000000_C );
}
/* store lodbias whether enabled or not -- fetch_texel currently
* respects it always.
*/
sse_movaps( func,
get_temp( TEMP_R0, 3 ),
make_xmm( 3 ) );
if (projected) {
FETCH( func, *inst, 3, 0, 3 );
emit_rcp( func, 3, 3 );
}
for (i = 0; i < count; i++) {
FETCH( func, *inst, i, 0, i );
if (projected) {
sse_mulps(
func,
make_xmm( i ),
make_xmm( 3 ) );
}
/* Store in the argument buffer:
*/
sse_movaps(
func,
get_temp( TEMP_R0, i ),
make_xmm( i ) );
}
args[0] = get_temp( TEMP_R0, 0 );
args[1] = get_sampler_ptr( unit );
emit_func_call( func,
0,
args,
Elements(args),
fetch_texel );
/* If all four channels are enabled, could use a pointer to
* dst[0].x instead of TEMP_R0 for store?
*/
FOR_EACH_DST0_ENABLED_CHANNEL( *inst, i ) {
sse_movaps(
func,
make_xmm( 0 ),
get_temp( TEMP_R0, i ) );
STORE( func, *inst, 0, 0, i );
}
}
static void
emit_kil(
struct x86_function *func,
@@ -2168,21 +2336,7 @@ emit_instruction(
break;
case TGSI_OPCODE_TEX:
if (0) {
/* Disable dummy texture code:
*/
emit_tempf(
func,
0,
TEMP_ONE_I,
TEMP_ONE_C );
FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
STORE( func, *inst, 0, 0, chan_index );
}
}
else {
return 0;
}
emit_tex( func, inst, FALSE, FALSE );
break;
case TGSI_OPCODE_TXD:
@@ -2280,7 +2434,7 @@ emit_instruction(
break;
case TGSI_OPCODE_TXB:
return 0;
emit_tex( func, inst, TRUE, FALSE );
break;
case TGSI_OPCODE_NRM:
@@ -2388,9 +2542,13 @@ emit_instruction(
break;
case TGSI_OPCODE_TXL:
return 0;
emit_tex( func, inst, TRUE, FALSE );
break;
case TGSI_OPCODE_TXP:
emit_tex( func, inst, FALSE, TRUE );
break;
case TGSI_OPCODE_BRK:
return 0;
break;
@@ -2758,6 +2916,12 @@ tgsi_emit_sse2(
func,
get_coef_base(),
x86_fn_arg( func, 4 ) );
x86_mov(
func,
get_sampler_base(),
x86_make_disp( get_machine_base(),
Offset( struct tgsi_exec_machine, Samplers ) ) );
}
+1
View File
@@ -72,6 +72,7 @@ fs_sse_prepare( const struct sp_fragment_shader *base,
struct tgsi_exec_machine *machine,
struct tgsi_sampler **samplers )
{
machine->Samplers = samplers;
}