aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/vl
diff options
context:
space:
mode:
authorChristian König <[email protected]>2010-11-24 23:54:21 +0100
committerChristian König <[email protected]>2010-11-24 23:54:21 +0100
commitc9e10c666adc64f6c5dfb04422560508f115aa54 (patch)
tree38ca900c79fea9fe77bb68be5f4aa5635a212c57 /src/gallium/auxiliary/vl
parentde623b96abea4352259c8079ddc1a16fe5d4b22f (diff)
[g3dvl] use four elements in matrix texture fetch
Diffstat (limited to 'src/gallium/auxiliary/vl')
-rw-r--r--src/gallium/auxiliary/vl/vl_idct.c50
1 files changed, 31 insertions, 19 deletions
diff --git a/src/gallium/auxiliary/vl/vl_idct.c b/src/gallium/auxiliary/vl/vl_idct.c
index 6e49600a286..497e67e94d3 100644
--- a/src/gallium/auxiliary/vl/vl_idct.c
+++ b/src/gallium/auxiliary/vl/vl_idct.c
@@ -147,10 +147,10 @@ static void
matrix_mul(struct ureg_program *shader, struct ureg_dst dst,
struct ureg_src tc[2], struct ureg_src sampler[2],
struct ureg_src start[2], struct ureg_src step[2],
- float scale)
+ bool fetch4[2], float scale)
{
struct ureg_dst t_tc[2], m[2][2], tmp[2];
- unsigned i, j;
+ unsigned side, i, j;
for(i = 0; i < 2; ++i) {
t_tc[i] = ureg_DECL_temporary(shader);
@@ -170,17 +170,19 @@ matrix_mul(struct ureg_program *shader, struct ureg_dst dst,
ureg_MOV(shader, ureg_writemask(t_tc[1], TGSI_WRITEMASK_X), tc[1]);
ureg_MOV(shader, ureg_writemask(t_tc[1], TGSI_WRITEMASK_Y), start[1]);
- for(i = 0; i < 2; ++i) {
- for(j = 0; j < 4; ++j) {
- /* Nouveau and r600g can't writemask tex dst regs (yet?), do in two steps */
- ureg_TEX(shader, tmp[0], TGSI_TEXTURE_2D, ureg_src(t_tc[0]), sampler[0]);
- ureg_MOV(shader, ureg_writemask(m[i][0], TGSI_WRITEMASK_X << j), ureg_scalar(ureg_src(tmp[0]), TGSI_SWIZZLE_X));
+ for(side = 0; side < 2; ++side) {
+ for(i = 0; i < 2; ++i) {
+ if(fetch4[side]) {
+ ureg_TEX(shader, m[i][side], TGSI_TEXTURE_2D, ureg_src(t_tc[side]), sampler[side]);
+ ureg_ADD(shader, ureg_writemask(t_tc[side], TGSI_WRITEMASK_X), ureg_src(t_tc[side]), step[side]);
- ureg_TEX(shader, tmp[1], TGSI_TEXTURE_2D, ureg_src(t_tc[1]), sampler[1]);
- ureg_MOV(shader, ureg_writemask(m[i][1], TGSI_WRITEMASK_X << j), ureg_scalar(ureg_src(tmp[1]), TGSI_SWIZZLE_X));
+ } else for(j = 0; j < 4; ++j) {
+ /* Nouveau and r600g can't writemask tex dst regs (yet?), do in two steps */
+ ureg_TEX(shader, tmp[side], TGSI_TEXTURE_2D, ureg_src(t_tc[side]), sampler[side]);
+ ureg_MOV(shader, ureg_writemask(m[i][side], TGSI_WRITEMASK_X << j), ureg_scalar(ureg_src(tmp[side]), TGSI_SWIZZLE_X));
- ureg_ADD(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_X), ureg_src(t_tc[0]), step[0]);
- ureg_ADD(shader, ureg_writemask(t_tc[1], TGSI_WRITEMASK_Y), ureg_src(t_tc[1]), step[1]);
+ ureg_ADD(shader, ureg_writemask(t_tc[side], TGSI_WRITEMASK_X << side), ureg_src(t_tc[side]), step[side]);
+ }
}
}
@@ -204,6 +206,7 @@ create_transpose_frag_shader(struct vl_idct *idct)
struct ureg_src tc[2], sampler[2];
struct ureg_src start[2], step[2];
struct ureg_dst fragment;
+ bool fetch4[2];
shader = ureg_create(TGSI_PROCESSOR_FRAGMENT);
if (!shader)
@@ -215,15 +218,18 @@ create_transpose_frag_shader(struct vl_idct *idct)
start[0] = ureg_imm1f(shader, 0.0f);
start[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_START, TGSI_INTERPOLATE_CONSTANT);
- step[0] = ureg_imm1f(shader, 1.0f / BLOCK_HEIGHT);
+ step[0] = ureg_imm1f(shader, 4.0f / BLOCK_HEIGHT);
step[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_STEP, TGSI_INTERPOLATE_CONSTANT);
sampler[0] = ureg_DECL_sampler(shader, 0);
sampler[1] = ureg_DECL_sampler(shader, 1);
+ fetch4[0] = true;
+ fetch4[1] = false;
+
fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
- matrix_mul(shader, fragment, tc, sampler, start, step, STAGE1_SCALE);
+ matrix_mul(shader, fragment, tc, sampler, start, step, fetch4, STAGE1_SCALE);
ureg_END(shader);
@@ -237,6 +243,7 @@ create_matrix_frag_shader(struct vl_idct *idct)
struct ureg_src tc[2], sampler[2];
struct ureg_src start[2], step[2];
struct ureg_dst fragment;
+ bool fetch4[2];
shader = ureg_create(TGSI_PROCESSOR_FRAGMENT);
if (!shader)
@@ -254,9 +261,12 @@ create_matrix_frag_shader(struct vl_idct *idct)
sampler[0] = ureg_DECL_sampler(shader, 1);
sampler[1] = ureg_DECL_sampler(shader, 0);
+ fetch4[0] = false;
+ fetch4[1] = false;
+
fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
- matrix_mul(shader, fragment, tc, sampler, start, step, STAGE2_SCALE);
+ matrix_mul(shader, fragment, tc, sampler, start, step, fetch4, STAGE2_SCALE);
ureg_END(shader);
@@ -360,18 +370,20 @@ init_buffers(struct vl_idct *idct)
memset(&template, 0, sizeof(struct pipe_resource));
template.target = PIPE_TEXTURE_2D;
- template.format = PIPE_FORMAT_R32_FLOAT;
+ template.format = PIPE_FORMAT_R32G32B32A32_FLOAT;
template.last_level = 0;
- template.width0 = 8;
+ template.width0 = 2;
template.height0 = 8;
template.depth0 = 1;
template.usage = PIPE_USAGE_IMMUTABLE;
template.bind = PIPE_BIND_SAMPLER_VIEW;
template.flags = 0;
- idct->textures.individual.matrix = idct->pipe->screen->resource_create(idct->pipe->screen, &template);
idct->textures.individual.transpose = idct->pipe->screen->resource_create(idct->pipe->screen, &template);
+ template.width0 = 8;
+ idct->textures.individual.matrix = idct->pipe->screen->resource_create(idct->pipe->screen, &template);
+
template.format = idct->destination->format;
template.width0 = idct->destination->width0;
template.height0 = idct->destination->height0;
@@ -505,7 +517,7 @@ init_constants(struct vl_idct *idct)
f = idct->pipe->transfer_map(idct->pipe, buf_transfer);
for(i = 0; i < BLOCK_HEIGHT; ++i)
for(j = 0; j < BLOCK_WIDTH; ++j)
- f[i * pitch + j] = const_matrix[j][i]; // transpose
+ f[i * pitch * 4 + j] = const_matrix[j][i]; // transpose
idct->pipe->transfer_unmap(idct->pipe, buf_transfer);
idct->pipe->transfer_destroy(idct->pipe, buf_transfer);
@@ -523,7 +535,7 @@ init_constants(struct vl_idct *idct)
f = idct->pipe->transfer_map(idct->pipe, buf_transfer);
for(i = 0; i < BLOCK_HEIGHT; ++i)
for(j = 0; j < BLOCK_WIDTH; ++j)
- f[i * pitch + j] = const_matrix[i][j];
+ f[i * pitch * 4 + j * 4] = const_matrix[i][j];
idct->pipe->transfer_unmap(idct->pipe, buf_transfer);
idct->pipe->transfer_destroy(idct->pipe, buf_transfer);