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. 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