diff options
Diffstat (limited to 'src/gallium/state_trackers/vega/asm_fill.h')
-rw-r--r-- | src/gallium/state_trackers/vega/asm_fill.h | 51 |
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, |