st/xorg: add yuv shaders

This commit is contained in:
Zack Rusin
2009-10-23 16:18:10 -04:00
parent 5241b9568c
commit 6b8ce4cc4f
3 changed files with 83 additions and 16 deletions
@@ -277,6 +277,70 @@ create_vs(struct pipe_context *pipe,
return ureg_create_shader_and_destroy(ureg, pipe);
}
static void *
create_yuv_shader(struct pipe_context *pipe, struct ureg_program *ureg)
{
struct ureg_src y_sampler, u_sampler, v_sampler;
struct ureg_src pos;
struct ureg_src matrow0, matrow1, matrow2;
struct ureg_dst y, u, v, rgb;
struct ureg_dst out = ureg_DECL_output(ureg,
TGSI_SEMANTIC_COLOR,
0);
pos = ureg_DECL_fs_input(ureg,
TGSI_SEMANTIC_GENERIC,
0,
TGSI_INTERPOLATE_PERSPECTIVE);
rgb = ureg_DECL_temporary(ureg);
y = ureg_DECL_temporary(ureg);
u = ureg_DECL_temporary(ureg);
v = ureg_DECL_temporary(ureg);
y_sampler = ureg_DECL_sampler(ureg, 0);
u_sampler = ureg_DECL_sampler(ureg, 1);
v_sampler = ureg_DECL_sampler(ureg, 2);
matrow0 = ureg_DECL_constant(ureg, 0);
matrow1 = ureg_DECL_constant(ureg, 1);
matrow2 = ureg_DECL_constant(ureg, 2);
ureg_TEX(ureg, y,
TGSI_TEXTURE_2D, pos, y_sampler);
ureg_TEX(ureg, u,
TGSI_TEXTURE_2D, pos, u_sampler);
ureg_TEX(ureg, v,
TGSI_TEXTURE_2D, pos, v_sampler);
ureg_MUL(ureg, rgb,
ureg_scalar(ureg_src(y), TGSI_SWIZZLE_X),
matrow0);
ureg_MAD(ureg, rgb,
ureg_scalar(ureg_src(u), TGSI_SWIZZLE_X),
matrow1,
ureg_src(rgb));
ureg_MAD(ureg, rgb,
ureg_scalar(ureg_src(v), TGSI_SWIZZLE_X),
matrow2,
ureg_src(rgb));
/* rgb.a = 1; */
ureg_MOV(ureg, ureg_writemask(rgb, TGSI_WRITEMASK_W),
ureg_scalar(matrow0, TGSI_SWIZZLE_X));
ureg_MOV(ureg, out, ureg_src(rgb));
ureg_release_temporary(ureg, rgb);
ureg_release_temporary(ureg, y);
ureg_release_temporary(ureg, u);
ureg_release_temporary(ureg, v);
ureg_END(ureg);
return ureg_create_shader_and_destroy(ureg, pipe);
}
static void *
create_fs(struct pipe_context *pipe,
unsigned fs_traits)
@@ -293,13 +357,14 @@ create_fs(struct pipe_context *pipe,
boolean is_lingrad = fs_traits & FS_LINGRAD_FILL;
boolean is_radgrad = fs_traits & FS_RADGRAD_FILL;
unsigned comp_alpha = fs_traits & FS_COMPONENT_ALPHA;
boolean is_yuv = fs_traits & FS_YUV;
ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
if (ureg == NULL)
return 0;
/* it has to be either a fill or a composite op */
debug_assert(is_fill ^ is_composite);
/* it has to be either a fill, a composite op or a yuv conversion */
debug_assert((is_fill ^ is_composite) ^ is_yuv);
out = ureg_DECL_output(ureg,
TGSI_SEMANTIC_COLOR,
@@ -311,8 +376,7 @@ create_fs(struct pipe_context *pipe,
TGSI_SEMANTIC_GENERIC,
0,
TGSI_INTERPOLATE_PERSPECTIVE);
} else {
debug_assert(is_fill);
} else if (is_fill) {
if (is_solid)
src_input = ureg_DECL_fs_input(ureg,
TGSI_SEMANTIC_COLOR,
@@ -323,6 +387,9 @@ create_fs(struct pipe_context *pipe,
TGSI_SEMANTIC_POSITION,
0,
TGSI_INTERPOLATE_PERSPECTIVE);
} else {
debug_assert(is_yuv);
return create_yuv_shader(pipe, ureg);
}
if (has_mask) {
@@ -21,13 +21,13 @@ enum xorg_fs_traits {
FS_SOLID_FILL = 1 << 2,
FS_LINGRAD_FILL = 1 << 3,
FS_RADGRAD_FILL = 1 << 4,
FS_CA_FULL = 1 << 5, /* src.rgba * mask.rgba */
FS_CA_SRCALPHA = 1 << 6, /* src.aaaa * mask.rgba */
FS_YUV = 1<< 7,
FS_FILL = (FS_SOLID_FILL |
FS_LINGRAD_FILL |
FS_RADGRAD_FILL),
/* src.rgba * mask.rgba */
FS_CA_FULL = 1 << 5,
/* src.aaaa * mask.rgba */
FS_CA_SRCALPHA = 1 << 6,
FS_COMPONENT_ALPHA = (FS_CA_FULL |
FS_CA_SRCALPHA)
};
+8 -8
View File
@@ -20,16 +20,16 @@
/* The ITU-R BT.601 conversion matrix for SDTV. */
static const float bt_601[] = {
1.0, 0.0, 1.4075,
1.0, -0.3455, -0.7169,
1.0, 1.7790, 0.
1.0, 0.0, 1.4075, 0,
1.0, -0.3455, -0.7169, 0,
1.0, 1.7790, 0., 0,
};
/* The ITU-R BT.709 conversion matrix for HDTV. */
static const float bt_709[] = {
1.0, 0.0, 1.581,
1.0, -0.1881, -0.47,
1.0, 1.8629, 0.
1.0, 0.0, 1.581, 0,
1.0, -0.1881, -0.47, 0,
1.0, 1.8629, 0., 0,
};
#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
@@ -284,8 +284,8 @@ static void
setup_video_constants(struct xorg_renderer *r, boolean hdtv)
{
struct pipe_context *pipe = r->pipe;
const int param_bytes = 9 * sizeof(float);
struct pipe_constant_buffer *cbuf = &r->vs_const_buffer;
const int param_bytes = 12 * sizeof(float);
struct pipe_constant_buffer *cbuf = &r->fs_const_buffer;
pipe_buffer_reference(&cbuf->buffer, NULL);
cbuf->buffer = pipe_buffer_create(pipe->screen, 16,