Hello,
i am starting a new branch called Vega-advance-blending.
The objective of this branch is implement advanced blending krhonos
specification.
If anyone has a different opinion let me know :).
Below you can see what i already have done in my local branch(a big
amount of code):
diff --git a/src/gallium/state_trackers/vega/api_params.c
b/src/gallium/state_trackers/vega/api_params.c
index db77fd9..c5ac8f8 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_XOR_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 9a06982..916af75 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,647 @@ 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
+blend_hardlight_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, temp[2], ureg_src(temp[0]), ureg_src(temp[0]));
+
+ ureg_SLT(ureg, temp[2], ureg_src(temp[2]),
+ ureg_scalar(ureg_src(temp[0]), 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
+blend_softlight_svg_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;
+ struct ureg_src imm, imm2, imm3;
+
+ imm = ureg_imm4f(ureg, 8, 8, 8, 8);
+ imm2 = ureg_imm4f(ureg, 3, 3, 3, 3);
+ imm3 = ureg_imm4f(ureg, 0.5, 0.5, 0.5, 0.5);
+
+ ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]);
+
+ ureg_ADD(ureg, temp[2], ureg_src(temp[0]), ureg_src(temp[0]));
+
+ ureg_SLT(ureg, temp[2], ureg_src(temp[2]),
+ ureg_scalar(ureg_src(temp[0]), 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_DIV(ureg, temp[2], ureg_src(temp[1]),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_SUB(ureg, temp[2], ureg_scalar(constant[1], TGSI_SWIZZLE_Y),
+ ureg_src(temp[2]));
+ ureg_ADD(ureg, temp[4], ureg_src(temp[0]), ureg_src(temp[0]));
+ ureg_SUB(ureg, temp[4], ureg_src(temp[4]),
+ ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_SUB(ureg, temp[2], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
+ ureg_src(temp[2]));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[1]), 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_MUL(ureg, temp[2], ureg_src(temp[1]), imm);
+ ureg_SLE(ureg, temp[2], ureg_src(temp[2]),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+
+ label = ureg_get_instruction_number(ureg);
+ label += 2;
+
+ ureg_IF(ureg, ureg_src(temp[2]), &label);
+ ureg_DIV(ureg, temp[2], ureg_src(temp[1]),
ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_SUB(ureg, temp[2], ureg_scalar(constant[1], TGSI_SWIZZLE_Y),
ureg_src(temp[2]));
+ ureg_ADD(ureg, temp[4], ureg_src(temp[0]), ureg_src(temp[0]));
+ ureg_SUB(ureg, temp[4], ureg_src(temp[4]),
ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_MUL(ureg, temp[4], ureg_src(temp[1]), imm);
+ ureg_DIV(ureg, temp[4], ureg_src(temp[4]),
ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_SUB(ureg, temp[4], imm2, ureg_src(temp[4]));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_SUB(ureg, temp[2], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
+ ureg_src(temp[2]));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[1]), ureg_src(temp[2]));
+ ureg_ADD(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[3]));
+
+ label = ureg_get_instruction_number(ureg);
+ label += 2;
+
+ ureg_ELSE(ureg, &label);
+ ureg_MUL(ureg, temp[2], ureg_src(temp[1]),
ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_DIV(ureg, temp[4], ureg_src(temp[1]),
ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_POW(ureg, temp[4], ureg_src(temp[4]), imm3);
+ ureg_MUL(ureg, temp[4], ureg_src(temp[4]),
ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_SUB(ureg, temp[4], ureg_src(temp[4]), ureg_src(temp[1]));
+ ureg_ADD(ureg, temp[5], ureg_src(temp[0]), ureg_src(temp[0]));
+ ureg_SUB(ureg, temp[5], ureg_src(temp[5]),
ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[4], ureg_src(temp[4]), ureg_src(temp[5]));
+ ureg_ADD(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_ADD(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
ureg_src(temp[2]), ureg_src(temp[3]));
+ ureg_ENDIF(ureg);
+
+ 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
+blend_softlight_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;
+ struct ureg_src imm, imm2, imm3, imm4, imm5;
+
+ imm = ureg_imm4f(ureg, 4, 4, 4, 4);
+ imm2 = ureg_imm4f(ureg, 3, 3, 3, 3);
+ imm3 = ureg_imm4f(ureg, 0.5, 0.5, 0.5, 0.5);
+ imm4 = ureg_imm4f(ureg, 16, 16, 16, 16);
+ imm5 = ureg_imm4f(ureg, 12, 12, 12, 12);
+
+ ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]);
+
+ ureg_ADD(ureg, temp[2], ureg_src(temp[0]), ureg_src(temp[0]));
+
+ ureg_SLT(ureg, temp[2], ureg_src(temp[2]),
+ ureg_scalar(ureg_src(temp[0]), 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_DIV(ureg, temp[2], ureg_src(temp[1]),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_SUB(ureg, temp[2], ureg_scalar(constant[1], TGSI_SWIZZLE_Y),
+ ureg_src(temp[2]));
+ ureg_ADD(ureg, temp[4], ureg_src(temp[0]), ureg_src(temp[0]));
+ ureg_SUB(ureg, temp[4], ureg_src(temp[4]),
+ ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_SUB(ureg, temp[2], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
+ ureg_src(temp[2]));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[1]), 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_MUL(ureg, temp[2], ureg_src(temp[1]), imm);
+ ureg_SLE(ureg, temp[2], ureg_src(temp[2]),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+
+ label = ureg_get_instruction_number(ureg);
+ label += 2;
+
+ ureg_IF(ureg, ureg_src(temp[2]), &label);
+ ureg_MUL(ureg, temp[2], imm4, ureg_src(temp[1]));
+ ureg_DIV(ureg, temp[2], ureg_src(temp[2]),
ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_SUB(ureg, temp[2], ureg_src(temp[2]), imm5);
+ ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[1]));
+ ureg_DIV(ureg, temp[2], ureg_src(temp[2]),
ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_ADD(ureg, temp[2], ureg_src(temp[2]), imm2);
+ ureg_ADD(ureg, temp[4], ureg_src(temp[0]), ureg_src(temp[0]));
+ ureg_SUB(ureg, temp[4], ureg_src(temp[4]),
ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[1]));
+ ureg_MUL(ureg, temp[4], ureg_src(temp[1]),
ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_ADD(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ 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_MUL(ureg, temp[2], ureg_src(temp[1]),
ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_DIV(ureg, temp[4], ureg_src(temp[1]),
ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_POW(ureg, temp[4], ureg_src(temp[4]), imm3);
+ ureg_MUL(ureg, temp[4], ureg_src(temp[4]),
ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_SUB(ureg, temp[4], ureg_src(temp[4]), ureg_src(temp[1]));
+ ureg_ADD(ureg, temp[5], ureg_src(temp[0]), ureg_src(temp[0]));
+ ureg_SUB(ureg, temp[5], ureg_src(temp[5]),
ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[4], ureg_src(temp[4]), ureg_src(temp[5]));
+ ureg_ADD(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_ADD(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
ureg_src(temp[2]), ureg_src(temp[3]));
+ ureg_ENDIF(ureg);
+
+ 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
+blend_colordodge_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_SLT(ureg, temp[2], ureg_src(temp[0]),
+ ureg_scalar(ureg_src(temp[0]), 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, temp[2], ureg_src(temp[1]),
ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_DIV(ureg, temp[4], ureg_src(temp[0]),
ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_SUB(ureg, temp[4], ureg_scalar(constant[1], TGSI_SWIZZLE_Y),
ureg_src(temp[4]));
+ ureg_DIV(ureg, temp[4], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_MUL(ureg, temp[2], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_MIN(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ 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_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[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
+blend_colorburn_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_XOR(ureg, temp[4], ureg_src(temp[4]), ureg_src(temp[4]));
+ ureg_SGT(ureg, temp[2], ureg_src(temp[0]), ureg_src(temp[4]));
+
+ EXTENDED_BLENDER_OVER_FUNC
+
+ label = ureg_get_instruction_number(ureg);
+ label += 2;
+
+ ureg_IF(ureg, ureg_src(temp[2]), &label);
+ ureg_SUB(ureg, temp[2], ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W),
+ ureg_src(temp[1]));
+ ureg_MUL(ureg, temp[2], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
+ ureg_src(temp[2]));
+ ureg_DIV(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[0]));
+ ureg_MUL(ureg, temp[4], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_MIN(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_SUB(ureg, temp[2], ureg_src(temp[4]), 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_MOV(ureg, temp[1], 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
+blend_difference_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)
+{
+ ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]);
+
+ ureg_MUL(ureg, temp[2], ureg_src(temp[0]),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[4], ureg_src(temp[1]),
+ ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_MIN(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_SUB(ureg, temp[2], ureg_src(temp[1]), ureg_src(temp[2]));
+ ureg_ADD(ureg, temp[1], ureg_src(temp[0]), ureg_src(temp[2]));
+
+ 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
+blend_subtract_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)
+{
+ ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]);
+ ureg_SUB(ureg, temp[2], ureg_src(temp[1]), ureg_src(temp[0]));
+ ureg_XOR(ureg, temp[3], ureg_src(temp[3]), ureg_src(temp[3]));
+ ureg_MAX(ureg, temp[1], ureg_src(temp[2]), ureg_src(temp[3]));
+
+ 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
+blend_invert_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)
+{
+ ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]);
+ ureg_SUB(ureg, temp[2], ureg_scalar(constant[1], TGSI_SWIZZLE_Y),
+ ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Y));
+ ureg_MUL(ureg, temp[2], ureg_src(temp[1]), ureg_src(temp[2]));
+ ureg_SUB(ureg, temp[3], ureg_scalar(constant[1], TGSI_SWIZZLE_Y),
+ ureg_src(temp[1]));
+ ureg_MUL(ureg, temp[3], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
+ ureg_src(temp[3]));
+ ureg_ADD(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
+ ureg_src(temp[2]), ureg_src(temp[3]));
+
+ 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
+blend_exclusion_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)
+{
+ ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]);
+ EXTENDED_BLENDER_OVER_FUNC
+ ureg_MUL(ureg, temp[2], ureg_src(temp[0]),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[4], ureg_src(temp[1]),
+ ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_ADD(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_MUL(ureg, temp[4], ureg_src(temp[0]), ureg_src(temp[1]));
+ ureg_ADD(ureg, temp[4], ureg_src(temp[4]), ureg_src(temp[4]));
+ ureg_SUB(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_ADD(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
+ ureg_src(temp[2]), ureg_src(temp[3]));
+
+ 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
+blend_lineardodge_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_MUL(ureg, temp[2], ureg_src(temp[0]),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[4], ureg_src(temp[1]),
+ ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_ADD(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_MUL(ureg, temp[4], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_SLE(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+
+ EXTENDED_BLENDER_OVER_FUNC
+
+ label = ureg_get_instruction_number(ureg);
+ label += 2;
+
+ ureg_IF(ureg, ureg_src(temp[2]), &label);
+ ureg_ADD(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
+ ureg_src(temp[0]), ureg_src(temp[1]));
+
+ label = ureg_get_instruction_number(ureg);
+ label += 2;
+ ureg_ELSE(ureg, &label);
+ 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, ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
+ 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
+blend_linearburn_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_MUL(ureg, temp[2], ureg_src(temp[0]),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_MUL(ureg, temp[4], ureg_src(temp[1]),
+ ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
+ ureg_ADD(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+ ureg_MUL(ureg, temp[4], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
+ ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
+ ureg_SGT(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[4]));
+
+ EXTENDED_BLENDER_OVER_FUNC
+
+ label = ureg_get_instruction_number(ureg);
+ label += 2;
+
+ ureg_IF(ureg, ureg_src(temp[2]), &label);
+ 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[4], ureg_src(temp[0]), ureg_src(temp[1]));
+ ureg_SUB(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
+ ureg_src(temp[4]), ureg_src(temp[2]));
+
+ label = ureg_get_instruction_number(ureg);
+ label += 2;
+ ureg_ELSE(ureg, &label);
+ ureg_MOV(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
+ 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 +1083,31 @@ 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},
+ {VEGA_BLEND_HARDLIGHT_KHR_SHADER, blend_hardlight_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_SOFTLIGHT_SVG_KHR_SHADER, blend_softlight_svg_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_SOFTLIGHT_KHR_SHADER, blend_softlight_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_COLORDODGE_KHR_SHADER, blend_colordodge_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_COLORBURN_KHR_SHADER, blend_colorburn_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_DIFFERENCE_KHR_SHADER, blend_difference_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_SUBTRACT_KHR_SHADER, blend_subtract_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_INVERT_KHR_SHADER, blend_invert_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_EXCLUSION_KHR_SHADER, blend_exclusion_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_LINEARDODGE_KHR_SHADER, blend_lineardodge_khr,
+ VG_TRUE, 1, 1, 2, 1, 0, 6},
+ {VEGA_BLEND_LINEARBURN_KHR_SHADER, blend_linearburn_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 0e71a50..e33b730 100644
--- a/src/gallium/state_trackers/vega/shader.c
+++ b/src/gallium/state_trackers/vega/shader.c
@@ -126,7 +126,19 @@ 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 ||
+ bmode == VG_BLEND_HARDLIGHT_KHR ||
+ bmode == VG_BLEND_SOFTLIGHT_SVG_KHR ||
+ bmode == VG_BLEND_SOFTLIGHT_KHR ||
+ bmode == VG_BLEND_COLORDODGE_KHR ||
+ bmode == VG_BLEND_COLORBURN_KHR ||
+ bmode == VG_BLEND_DIFFERENCE_KHR ||
+ bmode == VG_BLEND_SUBTRACT_KHR ||
+ bmode == VG_BLEND_INVERT_KHR ||
+ bmode == VG_BLEND_EXCLUSION_KHR ||
+ bmode == VG_BLEND_LINEARDODGE_KHR ||
+ bmode == VG_BLEND_LINEARBURN_KHR) {
struct st_framebuffer *stfb = ctx->draw_buffer;
vg_prepare_blend_surface(ctx);
@@ -261,6 +273,43 @@ 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;
+ case VG_BLEND_HARDLIGHT_KHR:
+ shader_id |= VEGA_BLEND_HARDLIGHT_KHR_SHADER;
+ break;
+ case VG_BLEND_SOFTLIGHT_SVG_KHR:
+ shader_id |= VEGA_BLEND_SOFTLIGHT_SVG_KHR_SHADER;
+ break;
+ case VG_BLEND_SOFTLIGHT_KHR:
+ shader_id |= VEGA_BLEND_SOFTLIGHT_KHR_SHADER;
+ break;
+ case VG_BLEND_COLORDODGE_KHR:
+ shader_id |= VEGA_BLEND_COLORDODGE_KHR_SHADER;
+ break;
+ case VG_BLEND_COLORBURN_KHR:
+ shader_id |= VEGA_BLEND_COLORBURN_KHR_SHADER;
+ break;
+ case VG_BLEND_DIFFERENCE_KHR:
+ shader_id |= VEGA_BLEND_DIFFERENCE_KHR_SHADER;
+ break;
+ case VG_BLEND_SUBTRACT_KHR:
+ shader_id |= VEGA_BLEND_SUBTRACT_KHR_SHADER;
+ break;
+ case VG_BLEND_INVERT_KHR:
+ shader_id |= VEGA_BLEND_INVERT_KHR_SHADER;
+ break;
+ case VG_BLEND_EXCLUSION_KHR:
+ shader_id |= VEGA_BLEND_EXCLUSION_KHR_SHADER;
+ break;
+ case VG_BLEND_LINEARDODGE_KHR:
+ shader_id |= VEGA_BLEND_LINEARDODGE_KHR_SHADER;
+ break;
+ case VG_BLEND_LINEARBURN_KHR:
+ shader_id |= VEGA_BLEND_LINEARBURN_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 847eee6..75319cc 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 f43fe6e..0474fde 100644
--- a/src/gallium/state_trackers/vega/shaders_cache.c
+++ b/src/gallium/state_trackers/vega/shaders_cache.c
@@ -333,23 +333,73 @@ 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;
+ } else if ((id & VEGA_BLEND_HARDLIGHT_KHR_SHADER)) {
+ debug_assert(shaders_asm[13].id == VEGA_BLEND_HARDLIGHT_KHR_SHADER);
+ shaders[idx] = &shaders_asm[13];
+ ++idx;
+ } else if ((id & VEGA_BLEND_SOFTLIGHT_SVG_KHR_SHADER)){
+ debug_assert(shaders_asm[14].id == VEGA_BLEND_SOFTLIGHT_SVG_KHR_SHADER);
+ shaders[idx] = &shaders_asm[14];
+ ++idx;
+ } else if ((id & VEGA_BLEND_SOFTLIGHT_KHR_SHADER)){
+ debug_assert(shaders_asm[15].id == VEGA_BLEND_SOFTLIGHT_KHR_SHADER);
+ shaders[idx] = &shaders_asm[15];
+ ++idx;
+ } else if ((id & VEGA_BLEND_COLORDODGE_KHR_SHADER)){
+ debug_assert(shaders_asm[16].id == VEGA_BLEND_COLORDODGE_KHR_SHADER);
+ shaders[idx] = &shaders_asm[16];
+ ++idx;
+ } else if ((id & VEGA_BLEND_COLORBURN_KHR_SHADER)){
+ debug_assert(shaders_asm[17].id == VEGA_BLEND_COLORBURN_KHR_SHADER);
+ shaders[idx] = &shaders_asm[17];
+ ++idx;
+ } else if ((id & VEGA_BLEND_DIFFERENCE_KHR_SHADER)){
+ debug_assert(shaders_asm[18].id == VEGA_BLEND_DIFFERENCE_KHR_SHADER);
+ shaders[idx] = &shaders_asm[18];
+ ++idx;
+ } else if ((id & VEGA_BLEND_SUBTRACT_KHR_SHADER)){
+ debug_assert(shaders_asm[19].id == VEGA_BLEND_SUBTRACT_KHR_SHADER);
+ shaders[idx] = &shaders_asm[19];
+ ++idx;
+ } else if ((id & VEGA_BLEND_INVERT_KHR_SHADER)){
+ debug_assert(shaders_asm[20].id == VEGA_BLEND_INVERT_KHR_SHADER);
+ shaders[idx] = &shaders_asm[20];
+ ++idx;
+ } else if ((id & VEGA_BLEND_EXCLUSION_KHR_SHADER)){
+ debug_assert(shaders_asm[21].id == VEGA_BLEND_EXCLUSION_KHR_SHADER);
+ shaders[idx] = &shaders_asm[21];
+ ++idx;
+ } else if ((id & VEGA_BLEND_LINEARDODGE_KHR_SHADER)){
+ debug_assert(shaders_asm[22].id == VEGA_BLEND_LINEARDODGE_KHR_SHADER);
+ shaders[idx] = &shaders_asm[22];
+ ++idx;
+ } else if ((id & VEGA_BLEND_LINEARBURN_KHR_SHADER)){
+ debug_assert(shaders_asm[23].id == VEGA_BLEND_LINEARBURN_KHR_SHADER);
+ shaders[idx] = &shaders_asm[23];
+ ++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[24].id == VEGA_PREMULTIPLY_SHADER);
+ shaders[idx] = &shaders_asm[24];
++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[25].id == VEGA_UNPREMULTIPLY_SHADER);
+ shaders[idx] = &shaders_asm[25];
++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[26].id == VEGA_BW_SHADER);
+ shaders[idx] = &shaders_asm[26];
++idx;
}
diff --git a/src/gallium/state_trackers/vega/shaders_cache.h
b/src/gallium/state_trackers/vega/shaders_cache.h
index feca58b..5e699fc 100644
--- a/src/gallium/state_trackers/vega/shaders_cache.h
+++ b/src/gallium/state_trackers/vega/shaders_cache.h
@@ -34,25 +34,37 @@ struct tgsi_token;
struct shaders_cache;
enum VegaShaderType {
- VEGA_SOLID_FILL_SHADER = 1 << 0,
- VEGA_LINEAR_GRADIENT_SHADER = 1 << 1,
- VEGA_RADIAL_GRADIENT_SHADER = 1 << 2,
- VEGA_PATTERN_SHADER = 1 << 3,
- VEGA_IMAGE_NORMAL_SHADER = 1 << 4,
- VEGA_IMAGE_MULTIPLY_SHADER = 1 << 5,
- VEGA_IMAGE_STENCIL_SHADER = 1 << 6,
+ VEGA_SOLID_FILL_SHADER = 1 << 0,
+ VEGA_LINEAR_GRADIENT_SHADER = 1 << 1,
+ VEGA_RADIAL_GRADIENT_SHADER = 1 << 2,
+ VEGA_PATTERN_SHADER = 1 << 3,
+ VEGA_IMAGE_NORMAL_SHADER = 1 << 4,
+ VEGA_IMAGE_MULTIPLY_SHADER = 1 << 5,
+ VEGA_IMAGE_STENCIL_SHADER = 1 << 6,
- VEGA_MASK_SHADER = 1 << 7,
+ VEGA_MASK_SHADER = 1 << 7,
- VEGA_BLEND_MULTIPLY_SHADER = 1 << 8,
- VEGA_BLEND_SCREEN_SHADER = 1 << 9,
- VEGA_BLEND_DARKEN_SHADER = 1 << 10,
- VEGA_BLEND_LIGHTEN_SHADER = 1 << 11,
+ VEGA_BLEND_MULTIPLY_SHADER = 1 << 8,
+ 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_BLEND_HARDLIGHT_KHR_SHADER = 1 << 13,
+ VEGA_BLEND_SOFTLIGHT_SVG_KHR_SHADER = 1 << 14,
+ VEGA_BLEND_SOFTLIGHT_KHR_SHADER = 1 << 15,
+ VEGA_BLEND_COLORDODGE_KHR_SHADER = 1 << 16,
+ VEGA_BLEND_COLORBURN_KHR_SHADER = 1 << 17,
+ VEGA_BLEND_DIFFERENCE_KHR_SHADER = 1 << 18,
+ VEGA_BLEND_SUBTRACT_KHR_SHADER = 1 << 19,
+ VEGA_BLEND_INVERT_KHR_SHADER = 1 << 20,
+ VEGA_BLEND_EXCLUSION_KHR_SHADER = 1 << 21,
+ VEGA_BLEND_LINEARDODGE_KHR_SHADER = 1 << 22,
+ VEGA_BLEND_LINEARBURN_KHR_SHADER = 1 << 23,
- VEGA_PREMULTIPLY_SHADER = 1 << 12,
- VEGA_UNPREMULTIPLY_SHADER = 1 << 13,
+ VEGA_PREMULTIPLY_SHADER = 1 << 24,
+ VEGA_UNPREMULTIPLY_SHADER = 1 << 25,
- VEGA_BW_SHADER = 1 << 14
+ VEGA_BW_SHADER = 1 << 26
};
struct vg_shader {
diff --git a/src/gallium/state_trackers/vega/vg_context.c
b/src/gallium/state_trackers/vega/vg_context.c
index 426bf9b..8c7fa97 100644
--- a/src/gallium/state_trackers/vega/vg_context.c
+++ b/src/gallium/state_trackers/vega/vg_context.c
@@ -339,6 +339,18 @@ 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:
+ case VG_BLEND_HARDLIGHT_KHR:
+ case VG_BLEND_SOFTLIGHT_SVG_KHR:
+ case VG_BLEND_SOFTLIGHT_KHR:
+ case VG_BLEND_COLORDODGE_KHR:
+ case VG_BLEND_COLORBURN_KHR:
+ case VG_BLEND_DIFFERENCE_KHR:
+ case VG_BLEND_SUBTRACT_KHR:
+ case VG_BLEND_INVERT_KHR:
+ case VG_BLEND_EXCLUSION_KHR:
+ case VG_BLEND_LINEARDODGE_KHR:
+ case VG_BLEND_LINEARBURN_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;
@@ -351,6 +363,48 @@ void vg_validate_state(struct vg_context *ctx)
blend->rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ONE;
blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE;
break;
+ case VG_BLEND_CLEAR_KHR:
+ blend->rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ZERO;
+ blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
+ blend->rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
+ blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
+ break;
+ case VG_BLEND_DST_KHR:
+ blend->rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ZERO;
+ blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
+ blend->rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ONE;
+ blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE;
+ break;
+ case VG_BLEND_SRC_OUT_KHR:
+ blend->rt[0].rgb_src_factor = PIPE_BLENDFACTOR_INV_DST_ALPHA;
+ blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_INV_DST_ALPHA;
+ blend->rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
+ blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
+ break;
+ case VG_BLEND_DST_OUT_KHR:
+ blend->rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ZERO;
+ blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
+ blend->rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
+ blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
+ break;
+ case VG_BLEND_SRC_ATOP_KHR:
+ blend->rt[0].rgb_src_factor = PIPE_BLENDFACTOR_DST_ALPHA;
+ blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_DST_ALPHA;
+ blend->rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
+ blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
+ break;
+ case VG_BLEND_DST_ATOP_KHR:
+ blend->rt[0].rgb_src_factor = PIPE_BLENDFACTOR_INV_DST_ALPHA;
+ blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_INV_DST_ALPHA;
+ blend->rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
+ blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
+ break;
+ case VG_BLEND_XOR_KHR:
+ blend->rt[0].rgb_src_factor = PIPE_BLENDFACTOR_INV_DST_ALPHA;
+ blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_INV_DST_ALPHA;
+ blend->rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
+ blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
+ break;
default:
assert(!"not implemented blend mode");
}
------------------------------------------------------------------------------
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev