summaryrefslogtreecommitdiff
path: root/src/gallium/state_trackers/vega/asm_fill.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/vega/asm_fill.h')
-rw-r--r--src/gallium/state_trackers/vega/asm_fill.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/vega/asm_fill.h b/src/gallium/state_trackers/vega/asm_fill.h
index 4bcd75d781..74b8988a88 100644
--- a/src/gallium/state_trackers/vega/asm_fill.h
+++ b/src/gallium/state_trackers/vega/asm_fill.h
@@ -710,6 +710,55 @@ blend_colordodge_khr( struct ureg_program *ureg,
}
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
premultiply( struct ureg_program *ureg,
struct ureg_dst *out,
struct ureg_src *in,
@@ -826,6 +875,8 @@ static const struct shader_asm_info shaders_asm[] = {
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},
/* premultiply */
{VEGA_PREMULTIPLY_SHADER, premultiply,