summaryrefslogtreecommitdiff
path: root/src/gallium/state_trackers/vega/shaders_cache.c
diff options
context:
space:
mode:
authorChia-I Wu <olv@lunarg.com>2010-12-04 12:03:07 +0800
committerChia-I Wu <olv@lunarg.com>2010-12-04 13:20:38 +0800
commite8ff3931f801dffdfd54832c298351e933688235 (patch)
tree44a830b96b474489bce1b7b02fa3d0008e799a35 /src/gallium/state_trackers/vega/shaders_cache.c
parenta19eaaa6c1956add5343295af7e9f682efa08d74 (diff)
st/vega: Add support for per-channel alpha.
Drawing an image in VG_DRAW_IMAGE_STENCIL mode produces per-channel alpha for use in blending. Add a new shader stage to produce and save it in TEMP[1]. For other modes that do not need per-channel alpha, the stage does MOV TEMP[1], TEMP[0].wwww
Diffstat (limited to 'src/gallium/state_trackers/vega/shaders_cache.c')
-rw-r--r--src/gallium/state_trackers/vega/shaders_cache.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/gallium/state_trackers/vega/shaders_cache.c b/src/gallium/state_trackers/vega/shaders_cache.c
index 76bac5139f..e9873eb18b 100644
--- a/src/gallium/state_trackers/vega/shaders_cache.c
+++ b/src/gallium/state_trackers/vega/shaders_cache.c
@@ -53,12 +53,13 @@
* 1) Paint generation (color/gradient/pattern)
* 2) Image composition (normal/multiply/stencil)
* 3) Color transform
- * 4) Extended blend (multiply/screen/darken/lighten)
- * 5) Mask
- * 6) Premultiply/Unpremultiply
- * 7) Color transform (to black and white)
+ * 4) Per-channel alpha generation
+ * 5) Extended blend (multiply/screen/darken/lighten)
+ * 6) Mask
+ * 7) Premultiply/Unpremultiply
+ * 8) Color transform (to black and white)
*/
-#define SHADER_STAGES 7
+#define SHADER_STAGES 8
struct cached_shader {
void *driver_shader;
@@ -301,6 +302,20 @@ create_shader(struct pipe_context *pipe,
}
/* fourth stage */
+ sh = SHADERS_GET_ALPHA_SHADER(id);
+ switch (sh) {
+ case VEGA_ALPHA_NORMAL_SHADER:
+ case VEGA_ALPHA_PER_CHANNEL_SHADER:
+ shaders[idx] = &shaders_alpha_asm[
+ (sh >> SHADERS_ALPHA_SHIFT) - 1];
+ assert(shaders[idx]->id == sh);
+ idx++;
+ break;
+ default:
+ break;
+ }
+
+ /* fifth stage */
sh = SHADERS_GET_BLEND_SHADER(id);
switch (sh) {
case VEGA_BLEND_MULTIPLY_SHADER:
@@ -315,7 +330,7 @@ create_shader(struct pipe_context *pipe,
break;
}
- /* fifth stage */
+ /* sixth stage */
sh = SHADERS_GET_MASK_SHADER(id);
switch (sh) {
case VEGA_MASK_SHADER:
@@ -327,7 +342,7 @@ create_shader(struct pipe_context *pipe,
break;
}
- /* sixth stage */
+ /* seventh stage */
sh = SHADERS_GET_PREMULTIPLY_SHADER(id);
switch (sh) {
case VEGA_PREMULTIPLY_SHADER:
@@ -341,7 +356,7 @@ create_shader(struct pipe_context *pipe,
break;
}
- /* seventh stage */
+ /* eighth stage */
sh = SHADERS_GET_BW_SHADER(id);
switch (sh) {
case VEGA_BW_SHADER: