Hi, On Fri, Feb 12, 2010 at 1:38 PM, Keith Whitwell <kei...@vmware.com> wrote: > On Fri, 2010-02-12 at 09:34 -0800, Igor Oliveira wrote: >> 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): > > This looks great -- only comment is that with larger shaders it becomes > difficult to see what formulae you're implementing. A comment > containing a textual expression of each advanced blend mode prior to all > the ureg calls would help a lot. >
Doing that. Igor > Keith > >> >> 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 >> Mesa3d-dev@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/mesa3d-dev > > > ------------------------------------------------------------------------------ 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 Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev