From: Chia-I Wu Date: Sat, 4 Dec 2010 03:23:41 +0000 (+0800) Subject: st/vega: Move masking after blending. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a19eaaa6c1956add5343295af7e9f682efa08d74;p=mesa.git st/vega: Move masking after blending. Masking should happen after blending. The shader is not entirely correct, but leave it as is for now. --- diff --git a/src/gallium/state_trackers/vega/asm_fill.h b/src/gallium/state_trackers/vega/asm_fill.h index 19a2d93fe59..22ad6ac39a5 100644 --- a/src/gallium/state_trackers/vega/asm_fill.h +++ b/src/gallium/state_trackers/vega/asm_fill.h @@ -173,38 +173,6 @@ paint_degenerate( struct ureg_program *ureg, ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[1]), sampler[0]); } -static INLINE void -color_transform( struct ureg_program *ureg, - struct ureg_dst *out, - struct ureg_src *in, - struct ureg_src *sampler, - struct ureg_dst *temp, - struct ureg_src *constant) -{ - ureg_MAD(ureg, temp[1], ureg_src(temp[0]), constant[0], constant[1]); - /* clamp to [0.0f, 1.0f] */ - ureg_CLAMP(ureg, temp[1], - ureg_src(temp[1]), - ureg_scalar(constant[3], TGSI_SWIZZLE_X), - ureg_scalar(constant[3], TGSI_SWIZZLE_Y)); - ureg_MOV(ureg, *out, ureg_src(temp[1])); -} - -static INLINE void -mask( struct ureg_program *ureg, - struct ureg_dst *out, - struct ureg_src *in, - struct ureg_src *sampler, - struct ureg_dst *temp, - struct ureg_src *constant) -{ - ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[1]); - ureg_MUL(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_W), - ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), - ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); - ureg_MOV(ureg, *out, ureg_src(temp[0])); -} - static INLINE void image_normal( struct ureg_program *ureg, struct ureg_dst *out, @@ -242,6 +210,23 @@ image_stencil( struct ureg_program *ureg, ureg_MUL(ureg, *out, ureg_src(temp[0]), ureg_src(temp[1])); } +static INLINE void +color_transform( struct ureg_program *ureg, + struct ureg_dst *out, + struct ureg_src *in, + struct ureg_src *sampler, + struct ureg_dst *temp, + struct ureg_src *constant) +{ + ureg_MAD(ureg, temp[1], ureg_src(temp[0]), constant[0], constant[1]); + /* clamp to [0.0f, 1.0f] */ + ureg_CLAMP(ureg, temp[1], + ureg_src(temp[1]), + ureg_scalar(constant[3], TGSI_SWIZZLE_X), + ureg_scalar(constant[3], TGSI_SWIZZLE_Y)); + ureg_MOV(ureg, *out, ureg_src(temp[1])); +} + /** * Emit instructions for the specified blend mode. Colors should be * premultiplied. Two temporary registers are required. @@ -395,6 +380,21 @@ blend_lighten( struct ureg_program *ureg, temp + 2); } +static INLINE void +mask( struct ureg_program *ureg, + struct ureg_dst *out, + struct ureg_src *in, + struct ureg_src *sampler, + struct ureg_dst *temp, + struct ureg_src *constant) +{ + ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[1]); + ureg_MUL(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_W), + ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), + ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); + ureg_MOV(ureg, *out, ureg_src(temp[0])); +} + static INLINE void premultiply( struct ureg_program *ureg, struct ureg_dst *out, @@ -500,11 +500,6 @@ static const struct shader_asm_info shaders_color_transform_asm[] = { VG_FALSE, 0, 4, 0, 0, 0, 2} }; -static const struct shader_asm_info shaders_mask_asm[] = { - {VEGA_MASK_SHADER, mask, - VG_TRUE, 0, 0, 1, 1, 0, 2} -}; - /* extra blend modes */ static const struct shader_asm_info shaders_blend_asm[] = { {VEGA_BLEND_MULTIPLY_SHADER, blend_multiply, @@ -517,6 +512,11 @@ static const struct shader_asm_info shaders_blend_asm[] = { VG_TRUE, 3, 1, 2, 1, 0, 4}, }; +static const struct shader_asm_info shaders_mask_asm[] = { + {VEGA_MASK_SHADER, mask, + VG_TRUE, 0, 0, 1, 1, 0, 2} +}; + /* premultiply */ static const struct shader_asm_info shaders_premultiply_asm[] = { {VEGA_PREMULTIPLY_SHADER, premultiply, diff --git a/src/gallium/state_trackers/vega/shader.c b/src/gallium/state_trackers/vega/shader.c index db410e3dadb..20ced813b4b 100644 --- a/src/gallium/state_trackers/vega/shader.c +++ b/src/gallium/state_trackers/vega/shader.c @@ -255,9 +255,6 @@ static void setup_shader_program(struct shader *shader) if (shader->color_transform) shader_id |= VEGA_COLOR_TRANSFORM_SHADER; - if (shader->masking) - shader_id |= VEGA_MASK_SHADER; - switch(blend_mode) { case VG_BLEND_MULTIPLY: shader_id |= VEGA_BLEND_MULTIPLY_SHADER; @@ -276,6 +273,9 @@ static void setup_shader_program(struct shader *shader) break; } + if (shader->masking) + shader_id |= VEGA_MASK_SHADER; + if (black_white) shader_id |= VEGA_BW_SHADER; diff --git a/src/gallium/state_trackers/vega/shaders_cache.c b/src/gallium/state_trackers/vega/shaders_cache.c index d1ebe7e6779..76bac5139f4 100644 --- a/src/gallium/state_trackers/vega/shaders_cache.c +++ b/src/gallium/state_trackers/vega/shaders_cache.c @@ -53,8 +53,8 @@ * 1) Paint generation (color/gradient/pattern) * 2) Image composition (normal/multiply/stencil) * 3) Color transform - * 4) Mask - * 5) Extended blend (multiply/screen/darken/lighten) + * 4) Extended blend (multiply/screen/darken/lighten) + * 5) Mask * 6) Premultiply/Unpremultiply * 7) Color transform (to black and white) */ @@ -301,10 +301,13 @@ create_shader(struct pipe_context *pipe, } /* fourth stage */ - sh = SHADERS_GET_MASK_SHADER(id); + sh = SHADERS_GET_BLEND_SHADER(id); switch (sh) { - case VEGA_MASK_SHADER: - shaders[idx] = &shaders_mask_asm[(sh >> SHADERS_MASK_SHIFT) - 1]; + case VEGA_BLEND_MULTIPLY_SHADER: + case VEGA_BLEND_SCREEN_SHADER: + case VEGA_BLEND_DARKEN_SHADER: + case VEGA_BLEND_LIGHTEN_SHADER: + shaders[idx] = &shaders_blend_asm[(sh >> SHADERS_BLEND_SHIFT) - 1]; assert(shaders[idx]->id == sh); idx++; break; @@ -313,13 +316,10 @@ create_shader(struct pipe_context *pipe, } /* fifth stage */ - sh = SHADERS_GET_BLEND_SHADER(id); + sh = SHADERS_GET_MASK_SHADER(id); switch (sh) { - case VEGA_BLEND_MULTIPLY_SHADER: - case VEGA_BLEND_SCREEN_SHADER: - case VEGA_BLEND_DARKEN_SHADER: - case VEGA_BLEND_LIGHTEN_SHADER: - shaders[idx] = &shaders_blend_asm[(sh >> SHADERS_BLEND_SHIFT) - 1]; + case VEGA_MASK_SHADER: + shaders[idx] = &shaders_mask_asm[(sh >> SHADERS_MASK_SHIFT) - 1]; assert(shaders[idx]->id == sh); idx++; break; diff --git a/src/gallium/state_trackers/vega/shaders_cache.h b/src/gallium/state_trackers/vega/shaders_cache.h index b626045f9af..008e4f5b94b 100644 --- a/src/gallium/state_trackers/vega/shaders_cache.h +++ b/src/gallium/state_trackers/vega/shaders_cache.h @@ -36,17 +36,17 @@ struct shaders_cache; #define _SHADERS_PAINT_BITS 3 #define _SHADERS_IMAGE_BITS 2 #define _SHADERS_COLOR_TRANSFORM_BITS 1 -#define _SHADERS_MASK_BITS 1 #define _SHADERS_BLEND_BITS 3 +#define _SHADERS_MASK_BITS 1 #define _SHADERS_PREMULTIPLY_BITS 2 #define _SHADERS_BW_BITS 1 #define SHADERS_PAINT_SHIFT (0) #define SHADERS_IMAGE_SHIFT (SHADERS_PAINT_SHIFT + _SHADERS_PAINT_BITS) #define SHADERS_COLOR_TRANSFORM_SHIFT (SHADERS_IMAGE_SHIFT + _SHADERS_IMAGE_BITS) -#define SHADERS_MASK_SHIFT (SHADERS_COLOR_TRANSFORM_SHIFT + _SHADERS_COLOR_TRANSFORM_BITS) -#define SHADERS_BLEND_SHIFT (SHADERS_MASK_SHIFT + _SHADERS_MASK_BITS) -#define SHADERS_PREMULTIPLY_SHIFT (SHADERS_BLEND_SHIFT + _SHADERS_BLEND_BITS) +#define SHADERS_BLEND_SHIFT (SHADERS_COLOR_TRANSFORM_SHIFT + _SHADERS_COLOR_TRANSFORM_BITS) +#define SHADERS_MASK_SHIFT (SHADERS_BLEND_SHIFT + _SHADERS_BLEND_BITS) +#define SHADERS_PREMULTIPLY_SHIFT (SHADERS_MASK_SHIFT + _SHADERS_MASK_BITS) #define SHADERS_BW_SHIFT (SHADERS_PREMULTIPLY_SHIFT + _SHADERS_PREMULTIPLY_BITS) #define _SHADERS_GET_STAGE(stage, id) \ @@ -55,8 +55,8 @@ struct shaders_cache; #define SHADERS_GET_PAINT_SHADER(id) _SHADERS_GET_STAGE(PAINT, id) #define SHADERS_GET_IMAGE_SHADER(id) _SHADERS_GET_STAGE(IMAGE, id) #define SHADERS_GET_COLOR_TRANSFORM_SHADER(id) _SHADERS_GET_STAGE(COLOR_TRANSFORM, id) -#define SHADERS_GET_MASK_SHADER(id) _SHADERS_GET_STAGE(MASK, id) #define SHADERS_GET_BLEND_SHADER(id) _SHADERS_GET_STAGE(BLEND, id) +#define SHADERS_GET_MASK_SHADER(id) _SHADERS_GET_STAGE(MASK, id) #define SHADERS_GET_PREMULTIPLY_SHADER(id) _SHADERS_GET_STAGE(PREMULTIPLY, id) #define SHADERS_GET_BW_SHADER(id) _SHADERS_GET_STAGE(BW, id) @@ -73,13 +73,13 @@ enum VegaShaderType { VEGA_COLOR_TRANSFORM_SHADER = 1 << SHADERS_COLOR_TRANSFORM_SHIFT, - VEGA_MASK_SHADER = 1 << SHADERS_MASK_SHIFT, - VEGA_BLEND_MULTIPLY_SHADER = 1 << SHADERS_BLEND_SHIFT, VEGA_BLEND_SCREEN_SHADER = 2 << SHADERS_BLEND_SHIFT, VEGA_BLEND_DARKEN_SHADER = 3 << SHADERS_BLEND_SHIFT, VEGA_BLEND_LIGHTEN_SHADER = 4 << SHADERS_BLEND_SHIFT, + VEGA_MASK_SHADER = 1 << SHADERS_MASK_SHIFT, + VEGA_PREMULTIPLY_SHADER = 1 << SHADERS_PREMULTIPLY_SHIFT, VEGA_UNPREMULTIPLY_SHADER = 2 << SHADERS_PREMULTIPLY_SHIFT,