diff options
author | Igor Oliveira <igor.oliveira@openbossa.org> | 2010-02-06 11:28:25 -0400 |
---|---|---|
committer | Igor Trindade Oliveira <igor@Cygnus.(none)> | 2010-02-11 10:36:24 -0400 |
commit | b3f1842c3f5d9ebd62a942e7e53b6b4be26c0aba (patch) | |
tree | 5505af37c6aba6100469022145babbd4088551d0 | |
parent | a44d9f78dd255d4c9e5e651a71d6bbca8788f81a (diff) |
vega: add support for VG_BLEND_OVERLAY_KHR blend advanced mode.
It is used by SVG1.2 and it is defined as:
Multiplies or screens the colors, dependent on the destination
color. Source colors overlay the destination whilst preserving its
highlights and shadows. The destination color is not replaced, but
is mixed with the source color to reflect the lightness or darkness
of the destination
-rw-r--r-- | src/gallium/state_trackers/vega/api_params.c | 3 | ||||
-rw-r--r-- | src/gallium/state_trackers/vega/asm_fill.h | 64 | ||||
-rw-r--r-- | src/gallium/state_trackers/vega/shader.c | 6 | ||||
-rw-r--r-- | src/gallium/state_trackers/vega/shader.h | 1 | ||||
-rw-r--r-- | src/gallium/state_trackers/vega/shaders_cache.c | 16 | ||||
-rw-r--r-- | src/gallium/state_trackers/vega/shaders_cache.h | 7 | ||||
-rw-r--r-- | src/gallium/state_trackers/vega/vg_context.c | 1 |
7 files changed, 87 insertions, 11 deletions
diff --git a/src/gallium/state_trackers/vega/api_params.c b/src/gallium/state_trackers/vega/api_params.c index db77fd9cb0..fde5950ffd 100644 --- a/src/gallium/state_trackers/vega/api_params.c +++ b/src/gallium/state_trackers/vega/api_params.c @@ -25,6 +25,7 @@ **************************************************************************/ #include "VG/openvg.h" +#include "VG/vgext.h" #include "vg_context.h" #include "paint.h" @@ -160,7 +161,7 @@ void vgSeti (VGParamType type, VGint value) break; case VG_BLEND_MODE: if (value < VG_BLEND_SRC || - value > VG_BLEND_ADDITIVE) + value > VG_BLEND_OVERLAY_KHR) error = VG_ILLEGAL_ARGUMENT_ERROR; else { ctx->state.dirty |= BLEND_DIRTY; diff --git a/src/gallium/state_trackers/vega/asm_fill.h b/src/gallium/state_trackers/vega/asm_fill.h index 9a06982c6a..b225c17e0e 100644 --- a/src/gallium/state_trackers/vega/asm_fill.h +++ b/src/gallium/state_trackers/vega/asm_fill.h @@ -28,6 +28,7 @@ #define ASM_FILL_H #include "tgsi/tgsi_ureg.h" +#include <stdio.h> typedef void (* ureg_func)( struct ureg_program *ureg, struct ureg_dst *out, @@ -335,6 +336,67 @@ blend_lighten( struct ureg_program *ureg, } static INLINE void +blend_overlay_khr( struct ureg_program *ureg, + struct ureg_dst *out, + struct ureg_src *in, + struct ureg_src *sampler, + struct ureg_dst *temp, + struct ureg_src *constant) +{ + unsigned label; + ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]); + ureg_ADD(ureg, + ureg_writemask(temp[2], TGSI_WRITEMASK_XYZ), + ureg_src(temp[1]), ureg_src(temp[1])); + + ureg_SLT(ureg, temp[2], ureg_src(temp[2]), + ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); + + ureg_MOV(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_W), + ureg_scalar(constant[1], TGSI_SWIZZLE_Y)); + + + EXTENDED_BLENDER_OVER_FUNC + + label = ureg_get_instruction_number(ureg); + label += 2; + + ureg_IF(ureg, ureg_src(temp[2]), &label); + ureg_MUL(ureg, + ureg_writemask(temp[2], TGSI_WRITEMASK_XYZ), + ureg_src(temp[0]), ureg_src(temp[1])); + ureg_ADD(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[2])); + ureg_ADD(ureg, temp[1], ureg_src(temp[2]), ureg_src(temp[3])); + + label = ureg_get_instruction_number(ureg); + label += 2; + + ureg_ELSE(ureg, &label); + ureg_SUB(ureg, temp[2], + ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W), + ureg_src(temp[1])); + ureg_SUB(ureg, temp[4], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), + ureg_src(temp[0])); + ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4])); + ureg_ADD(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[2])); + ureg_MUL(ureg, temp[4], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), + ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); + ureg_SUB(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_XYZ), + ureg_src(temp[4]), ureg_src(temp[2])); + ureg_ADD(ureg, temp[1], ureg_src(temp[2]), ureg_src(temp[3])); + ureg_ENDIF(ureg); + + ureg_MUL(ureg, temp[2], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), + ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); + ureg_ADD(ureg, temp[3], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), + ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); + ureg_SUB(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_W), + ureg_src(temp[3]), ureg_src(temp[2])); + + ureg_MOV(ureg, *out, ureg_src(temp[1])); +} + +static INLINE void premultiply( struct ureg_program *ureg, struct ureg_dst *out, struct ureg_src *in, @@ -441,6 +503,8 @@ static const struct shader_asm_info shaders_asm[] = { VG_TRUE, 1, 1, 2, 1, 0, 6}, {VEGA_BLEND_LIGHTEN_SHADER, blend_lighten, VG_TRUE, 1, 1, 2, 1, 0, 6}, + {VEGA_BLEND_OVERLAY_KHR_SHADER, blend_overlay_khr, + VG_TRUE, 1, 1, 2, 1, 0, 6}, /* premultiply */ {VEGA_PREMULTIPLY_SHADER, premultiply, diff --git a/src/gallium/state_trackers/vega/shader.c b/src/gallium/state_trackers/vega/shader.c index 0e71a507bf..4f82d03a86 100644 --- a/src/gallium/state_trackers/vega/shader.c +++ b/src/gallium/state_trackers/vega/shader.c @@ -126,7 +126,8 @@ static VGint blend_bind_samplers(struct vg_context *ctx, if (bmode == VG_BLEND_MULTIPLY || bmode == VG_BLEND_SCREEN || bmode == VG_BLEND_DARKEN || - bmode == VG_BLEND_LIGHTEN) { + bmode == VG_BLEND_LIGHTEN || + bmode == VG_BLEND_OVERLAY_KHR) { struct st_framebuffer *stfb = ctx->draw_buffer; vg_prepare_blend_surface(ctx); @@ -261,6 +262,9 @@ static void setup_shader_program(struct shader *shader) case VG_BLEND_LIGHTEN: shader_id |= VEGA_BLEND_LIGHTEN_SHADER; break; + case VG_BLEND_OVERLAY_KHR: + shader_id |= VEGA_BLEND_OVERLAY_KHR_SHADER; + break; default: /* handled by pipe_blend_state */ break; diff --git a/src/gallium/state_trackers/vega/shader.h b/src/gallium/state_trackers/vega/shader.h index 847eee6a31..75319cc155 100644 --- a/src/gallium/state_trackers/vega/shader.h +++ b/src/gallium/state_trackers/vega/shader.h @@ -28,6 +28,7 @@ #define SHADER_H #include "VG/openvg.h" +#include "VG/vgext.h" struct shader; struct vg_paint; diff --git a/src/gallium/state_trackers/vega/shaders_cache.c b/src/gallium/state_trackers/vega/shaders_cache.c index f43fe6ee4c..4f388dc7af 100644 --- a/src/gallium/state_trackers/vega/shaders_cache.c +++ b/src/gallium/state_trackers/vega/shaders_cache.c @@ -333,23 +333,27 @@ create_shader(struct pipe_context *pipe, debug_assert(shaders_asm[11].id == VEGA_BLEND_LIGHTEN_SHADER); shaders[idx] = &shaders_asm[11]; ++idx; + } else if ((id & VEGA_BLEND_OVERLAY_KHR_SHADER)) { + debug_assert(shaders_asm[12].id == VEGA_BLEND_OVERLAY_KHR_SHADER); + shaders[idx] = &shaders_asm[12]; + ++idx; } /* fifth stage */ if ((id & VEGA_PREMULTIPLY_SHADER)) { - debug_assert(shaders_asm[12].id == VEGA_PREMULTIPLY_SHADER); - shaders[idx] = &shaders_asm[12]; + debug_assert(shaders_asm[13].id == VEGA_PREMULTIPLY_SHADER); + shaders[idx] = &shaders_asm[13]; ++idx; } else if ((id & VEGA_UNPREMULTIPLY_SHADER)) { - debug_assert(shaders_asm[13].id == VEGA_UNPREMULTIPLY_SHADER); - shaders[idx] = &shaders_asm[13]; + debug_assert(shaders_asm[14].id == VEGA_UNPREMULTIPLY_SHADER); + shaders[idx] = &shaders_asm[14]; ++idx; } /* sixth stage */ if ((id & VEGA_BW_SHADER)) { - debug_assert(shaders_asm[14].id == VEGA_BW_SHADER); - shaders[idx] = &shaders_asm[14]; + debug_assert(shaders_asm[15].id == VEGA_BW_SHADER); + shaders[idx] = &shaders_asm[15]; ++idx; } diff --git a/src/gallium/state_trackers/vega/shaders_cache.h b/src/gallium/state_trackers/vega/shaders_cache.h index feca58b61a..8e91fdd5e7 100644 --- a/src/gallium/state_trackers/vega/shaders_cache.h +++ b/src/gallium/state_trackers/vega/shaders_cache.h @@ -48,11 +48,12 @@ enum VegaShaderType { VEGA_BLEND_SCREEN_SHADER = 1 << 9, VEGA_BLEND_DARKEN_SHADER = 1 << 10, VEGA_BLEND_LIGHTEN_SHADER = 1 << 11, + VEGA_BLEND_OVERLAY_KHR_SHADER = 1 << 12, - VEGA_PREMULTIPLY_SHADER = 1 << 12, - VEGA_UNPREMULTIPLY_SHADER = 1 << 13, + VEGA_PREMULTIPLY_SHADER = 1 << 13, + VEGA_UNPREMULTIPLY_SHADER = 1 << 14, - VEGA_BW_SHADER = 1 << 14 + VEGA_BW_SHADER = 1 << 15 }; struct vg_shader { diff --git a/src/gallium/state_trackers/vega/vg_context.c b/src/gallium/state_trackers/vega/vg_context.c index 426bf9bc62..390b2918fa 100644 --- a/src/gallium/state_trackers/vega/vg_context.c +++ b/src/gallium/state_trackers/vega/vg_context.c @@ -339,6 +339,7 @@ void vg_validate_state(struct vg_context *ctx) case VG_BLEND_SCREEN: case VG_BLEND_DARKEN: case VG_BLEND_LIGHTEN: + case VG_BLEND_OVERLAY_KHR: blend->rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; blend->rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; |