summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Oliveira <igor.oliveira@openbossa.org>2010-02-06 11:28:25 -0400
committerIgor Trindade Oliveira <igor@Cygnus.(none)>2010-02-11 10:36:24 -0400
commitb3f1842c3f5d9ebd62a942e7e53b6b4be26c0aba (patch)
tree5505af37c6aba6100469022145babbd4088551d0
parenta44d9f78dd255d4c9e5e651a71d6bbca8788f81a (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.c3
-rw-r--r--src/gallium/state_trackers/vega/asm_fill.h64
-rw-r--r--src/gallium/state_trackers/vega/shader.c6
-rw-r--r--src/gallium/state_trackers/vega/shader.h1
-rw-r--r--src/gallium/state_trackers/vega/shaders_cache.c16
-rw-r--r--src/gallium/state_trackers/vega/shaders_cache.h7
-rw-r--r--src/gallium/state_trackers/vega/vg_context.c1
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;