Hi,
On Fri, Feb 12, 2010 at 1:38 PM, Keith Whitwell <[email protected]> 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
>> [email protected]
>> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev