mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 02:00:12 +01:00
i915g: Finish out blend factor overrides for both RGBx and A8.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11559>
This commit is contained in:
parent
2683c7bf9a
commit
1ccb8ab801
7 changed files with 96 additions and 57 deletions
|
|
@ -158,10 +158,6 @@ spec@!opengl 1.1@clipflat@glDrawElements(GL_QUADS)- glFrontFace(GL_CW)- glPolygo
|
|||
spec@!opengl 1.1@clipflat@glDrawElements(GL_QUAD_STRIP)- glFrontFace(GL_CCW)- glPolygonMode(GL_FILL)- quadrant: center middle PV: FIRST,Fail
|
||||
spec@!opengl 1.1@clipflat@glDrawElements(GL_QUAD_STRIP)- glFrontFace(GL_CW)- glPolygonMode(GL_FILL)- quadrant: center middle PV: FIRST,Fail
|
||||
spec@!opengl 1.1@depthstencil-default_fb-clear,Fail
|
||||
spec@!opengl 1.1@depthstencil-default_fb-copypixels,Fail
|
||||
spec@!opengl 1.1@depthstencil-default_fb-drawpixels-float-and-ushort,Fail
|
||||
spec@!opengl 1.1@draw-pixels,Fail
|
||||
spec@!opengl 1.1@drawpix-z,Fail
|
||||
spec@!opengl 1.1@getteximage-formats,Crash
|
||||
spec@!opengl 1.1@gl-1.1-drawarrays-vertex-count 100000 varray gl_quad_strip,Crash
|
||||
spec@!opengl 1.1@gl-1.1-drawarrays-vertex-count 100000 vbo gl_quad_strip,Crash
|
||||
|
|
@ -251,7 +247,6 @@ spec@!opengl 1.2@texwrap 3d proj,Fail
|
|||
spec@!opengl 1.2@texwrap 3d proj@GL_RGBA8- NPOT- projected,Fail
|
||||
spec@!opengl 1.2@texwrap 3d proj bordercolor,Fail
|
||||
spec@!opengl 1.2@texwrap 3d proj bordercolor@GL_RGBA8- projected- border color only,Fail
|
||||
spec@!opengl 1.4@copy-pixels,Fail
|
||||
spec@!opengl 1.4@gl-1.4-polygon-offset,Fail
|
||||
|
||||
# 1D textures are treated as 2D, but we don't force
|
||||
|
|
@ -335,12 +330,6 @@ spec@arb_depth_texture@fbo-clear-formats@GL_DEPTH_COMPONENT,Fail
|
|||
spec@arb_depth_texture@fbo-clear-formats@GL_DEPTH_COMPONENT16,Fail
|
||||
spec@arb_depth_texture@fbo-clear-formats@GL_DEPTH_COMPONENT24,Fail
|
||||
spec@arb_depth_texture@fbo-clear-formats@GL_DEPTH_COMPONENT32,Fail
|
||||
spec@arb_depth_texture@fbo-depth-gl_depth_component16-copypixels,Fail
|
||||
spec@arb_depth_texture@fbo-depth-gl_depth_component16-drawpixels,Fail
|
||||
spec@arb_depth_texture@fbo-depth-gl_depth_component24-copypixels,Fail
|
||||
spec@arb_depth_texture@fbo-depth-gl_depth_component24-drawpixels,Fail
|
||||
spec@arb_depth_texture@fbo-depth-gl_depth_component32-copypixels,Fail
|
||||
spec@arb_depth_texture@fbo-depth-gl_depth_component32-drawpixels,Fail
|
||||
spec@arb_depth_texture@fbo-generatemipmap-formats,Fail
|
||||
spec@arb_depth_texture@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT,Fail
|
||||
spec@arb_depth_texture@fbo-generatemipmap-formats@GL_DEPTH_COMPONENT NPOT,Fail
|
||||
|
|
@ -366,7 +355,6 @@ spec@arb_fragment_program_shadow@tex-shadow2drect,Fail
|
|||
spec@arb_fragment_program_shadow@txp-shadow1d,Fail
|
||||
spec@arb_fragment_program_shadow@txp-shadow2d,Fail
|
||||
spec@arb_fragment_program_shadow@txp-shadow2drect,Fail
|
||||
spec@arb_framebuffer_object@arb_framebuffer_object-depth-stencil-blit depth gl_depth24_stencil8,Fail
|
||||
spec@arb_framebuffer_object@arb_framebuffer_object-depth-stencil-blit stencil gl_depth24_stencil8,Fail
|
||||
spec@arb_framebuffer_object@arb_framebuffer_object-depth-stencil-blit stencil gl_stencil_index1,Fail
|
||||
spec@arb_framebuffer_object@arb_framebuffer_object-depth-stencil-blit stencil gl_stencil_index16,Fail
|
||||
|
|
@ -410,7 +398,6 @@ spec@arb_texture_compression@texwrap formats bordercolor@GL_COMPRESSED_RGB- bord
|
|||
spec@arb_texture_compression@texwrap formats bordercolor@GL_COMPRESSED_RGBA- border color only,Fail
|
||||
spec@arb_texture_cube_map@copyteximage cube,Fail
|
||||
spec@arb_texture_cube_map@cubemap npot,Fail
|
||||
spec@arb_texture_rectangle@copyteximage rect,Fail
|
||||
spec@arb_texture_rectangle@glsl-fs-shadow2drect,Fail
|
||||
spec@arb_texture_rectangle@glsl-fs-shadow2drect-01,Fail
|
||||
spec@arb_texture_rectangle@glsl-fs-shadow2drect-03,Fail
|
||||
|
|
@ -491,12 +478,6 @@ spec@ext_framebuffer_multisample@accuracy all_samples stencil_resolve depthstenc
|
|||
spec@ext_framebuffer_multisample@accuracy all_samples stencil_resolve small depthstencil,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-format-quirks,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@3,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_ALPHA,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_ALPHA12,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_ALPHA16,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_ALPHA4,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_ALPHA8,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY12,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY16,Fail
|
||||
|
|
@ -507,13 +488,9 @@ spec@ext_framebuffer_object@fbo-blending-formats@GL_LUMINANCE12,Fail
|
|||
spec@ext_framebuffer_object@fbo-blending-formats@GL_LUMINANCE16,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_LUMINANCE4,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_LUMINANCE8,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_RGB,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_RGB10,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_RGB12,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_RGB16,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_RGB4,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_RGB5,Fail
|
||||
spec@ext_framebuffer_object@fbo-blending-formats@GL_RGB8,Fail
|
||||
spec@ext_framebuffer_object@fbo-clear-formats,Fail
|
||||
spec@ext_framebuffer_object@fbo-clear-formats@GL_INTENSITY,Fail
|
||||
spec@ext_framebuffer_object@fbo-clear-formats@GL_INTENSITY12,Fail
|
||||
|
|
@ -581,19 +558,13 @@ spec@ext_image_dma_buf_import@ext_image_dma_buf_import-transcode-nv12-as-r8-gr88
|
|||
spec@ext_image_dma_buf_import@ext_image_dma_buf_import-unsupported_format,Fail
|
||||
spec@ext_occlusion_query_boolean@any-samples,Fail
|
||||
spec@ext_packed_depth_stencil@depth_stencil texture,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-blit-d24s8,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-clear-formats,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-clear-formats@GL_DEPTH24_STENCIL8,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-clear-formats@GL_DEPTH_STENCIL,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-clear-formats stencil,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-clear-formats stencil@GL_DEPTH24_STENCIL8,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-clear-formats stencil@GL_DEPTH_STENCIL,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-depth-gl_depth24_stencil8-blit,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-depth-gl_depth24_stencil8-copypixels,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-depth-gl_depth24_stencil8-drawpixels,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-depthstencil-gl_depth24_stencil8-clear,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-depthstencil-gl_depth24_stencil8-copypixels,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-depthstencil-gl_depth24_stencil8-drawpixels-float-and-ushort,Fail
|
||||
spec@ext_packed_depth_stencil@fbo-stencil-gl_depth24_stencil8-blit,Fail
|
||||
spec@ext_packed_depth_stencil@texwrap formats bordercolor,Fail
|
||||
spec@ext_packed_depth_stencil@texwrap formats bordercolor@GL_DEPTH24_STENCIL8- border color only,Fail
|
||||
|
|
|
|||
|
|
@ -181,9 +181,15 @@ struct i915_state
|
|||
|
||||
struct i915_blend_state {
|
||||
unsigned iab;
|
||||
unsigned iab_alpha_in_g;
|
||||
unsigned iab_alpha_is_x;
|
||||
|
||||
unsigned modes4;
|
||||
unsigned LIS5;
|
||||
|
||||
unsigned LIS6;
|
||||
unsigned LIS6_alpha_in_g;
|
||||
unsigned LIS6_alpha_is_x;
|
||||
};
|
||||
|
||||
struct i915_depth_stencil_state {
|
||||
|
|
@ -222,6 +228,9 @@ struct i915_surface {
|
|||
uint32_t oc_swizzle;
|
||||
/* cbuf swizzle from dst r/g/b/a channels in memory to channels of gallium API. */
|
||||
uint8_t color_swizzle[4];
|
||||
|
||||
bool alpha_in_g : 1;
|
||||
bool alpha_is_x : 1;
|
||||
};
|
||||
|
||||
struct i915_velems_state {
|
||||
|
|
|
|||
|
|
@ -97,6 +97,50 @@ static unsigned translate_mip_filter( unsigned filter )
|
|||
}
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
i915_remap_lis6_blend_dst_alpha(uint32_t lis6, uint32_t normal, uint32_t inv)
|
||||
{
|
||||
uint32_t src = (lis6 >> S6_CBUF_SRC_BLEND_FACT_SHIFT) & BLENDFACT_MASK;
|
||||
lis6 &= ~SRC_BLND_FACT(BLENDFACT_MASK);
|
||||
if (src == BLENDFACT_DST_ALPHA)
|
||||
src = normal;
|
||||
else if (src == BLENDFACT_INV_DST_ALPHA)
|
||||
src = inv;
|
||||
lis6 |= SRC_BLND_FACT(src);
|
||||
|
||||
uint32_t dst = (lis6 >> S6_CBUF_DST_BLEND_FACT_SHIFT) & BLENDFACT_MASK;
|
||||
lis6 &= ~DST_BLND_FACT(BLENDFACT_MASK);
|
||||
if (dst == BLENDFACT_DST_ALPHA)
|
||||
dst = normal;
|
||||
else if (dst == BLENDFACT_INV_DST_ALPHA)
|
||||
dst = inv;
|
||||
lis6 |= DST_BLND_FACT(dst);
|
||||
|
||||
return lis6;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
i915_remap_iab_blend_dst_alpha(uint32_t iab, uint32_t normal, uint32_t inv)
|
||||
{
|
||||
uint32_t src = (iab >> IAB_SRC_FACTOR_SHIFT) & BLENDFACT_MASK;
|
||||
iab &= ~SRC_BLND_FACT(BLENDFACT_MASK);
|
||||
if (src == BLENDFACT_DST_ALPHA)
|
||||
src = normal;
|
||||
else if (src == BLENDFACT_INV_DST_ALPHA)
|
||||
src = inv;
|
||||
iab |= SRC_ABLND_FACT(src);
|
||||
|
||||
uint32_t dst = (iab >> IAB_DST_FACTOR_SHIFT) & BLENDFACT_MASK;
|
||||
iab &= ~DST_BLND_FACT(BLENDFACT_MASK);
|
||||
if (dst == BLENDFACT_DST_ALPHA)
|
||||
dst = normal;
|
||||
else if (dst == BLENDFACT_INV_DST_ALPHA)
|
||||
dst = inv;
|
||||
iab |= DST_ABLND_FACT(dst);
|
||||
|
||||
return iab;
|
||||
}
|
||||
|
||||
/* None of this state is actually used for anything yet.
|
||||
*/
|
||||
static void *
|
||||
|
|
@ -173,6 +217,16 @@ i915_create_blend_state(struct pipe_context *pipe,
|
|||
(i915_translate_blend_func(funcRGB) << S6_CBUF_BLEND_FUNC_SHIFT));
|
||||
}
|
||||
|
||||
cso_data->LIS6_alpha_in_g =
|
||||
i915_remap_lis6_blend_dst_alpha(cso_data->LIS6, BLENDFACT_DST_COLR, BLENDFACT_INV_DST_COLR);
|
||||
cso_data->LIS6_alpha_is_x =
|
||||
i915_remap_lis6_blend_dst_alpha(cso_data->LIS6, BLENDFACT_ONE, BLENDFACT_ZERO);
|
||||
|
||||
cso_data->iab_alpha_in_g =
|
||||
i915_remap_iab_blend_dst_alpha(cso_data->iab, BLENDFACT_DST_COLR, BLENDFACT_INV_DST_COLR);
|
||||
cso_data->iab_alpha_is_x =
|
||||
i915_remap_iab_blend_dst_alpha(cso_data->iab, BLENDFACT_ONE, BLENDFACT_ZERO);
|
||||
|
||||
return cso_data;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -164,7 +164,17 @@ const struct i915_tracked_state i915_upload_BLENDCOLOR = {
|
|||
*/
|
||||
static void upload_IAB(struct i915_context *i915)
|
||||
{
|
||||
unsigned iab = i915->blend->iab;
|
||||
unsigned iab = 0;
|
||||
|
||||
if (i915->blend) {
|
||||
struct i915_surface *cbuf = i915_surface(i915->framebuffer.cbufs[0]);
|
||||
if (cbuf && cbuf->alpha_in_g)
|
||||
iab |= i915->blend->iab_alpha_in_g;
|
||||
else if (cbuf && cbuf->alpha_is_x)
|
||||
iab |= i915->blend->iab_alpha_is_x;
|
||||
else
|
||||
iab |= i915->blend->iab;
|
||||
}
|
||||
|
||||
set_dynamic(i915, I915_DYNAMIC_IAB, iab);
|
||||
}
|
||||
|
|
@ -172,7 +182,7 @@ static void upload_IAB(struct i915_context *i915)
|
|||
const struct i915_tracked_state i915_upload_IAB = {
|
||||
"IAB",
|
||||
upload_IAB,
|
||||
I915_NEW_BLEND
|
||||
I915_NEW_BLEND | I915_NEW_FRAMEBUFFER
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -154,27 +154,6 @@ static void emit_immediate_s5(struct i915_context *i915, uint imm)
|
|||
OUT_BATCH(imm);
|
||||
}
|
||||
|
||||
static void emit_immediate_s6(struct i915_context *i915, uint imm)
|
||||
{
|
||||
/* Fixup blend function for A8 dst buffers.
|
||||
* When we blend to an A8 buffer, the GPU thinks it's a G8 buffer,
|
||||
* and therefore we need to use the color factor for alphas. */
|
||||
uint srcRGB;
|
||||
|
||||
if (i915->framebuffer.cbufs[0] &&
|
||||
i915->framebuffer.cbufs[0]->format == PIPE_FORMAT_A8_UNORM) {
|
||||
srcRGB = (imm >> S6_CBUF_SRC_BLEND_FACT_SHIFT) & BLENDFACT_MASK;
|
||||
if (srcRGB == BLENDFACT_DST_ALPHA)
|
||||
srcRGB = BLENDFACT_DST_COLR;
|
||||
else if (srcRGB == BLENDFACT_INV_DST_ALPHA)
|
||||
srcRGB = BLENDFACT_INV_DST_COLR;
|
||||
imm &= ~SRC_BLND_FACT(BLENDFACT_MASK);
|
||||
imm |= SRC_BLND_FACT(srcRGB);
|
||||
}
|
||||
|
||||
OUT_BATCH(imm);
|
||||
}
|
||||
|
||||
static void
|
||||
emit_immediate(struct i915_context *i915)
|
||||
{
|
||||
|
|
@ -202,8 +181,6 @@ emit_immediate(struct i915_context *i915)
|
|||
if (dirty & (1 << i)) {
|
||||
if (i == I915_IMMEDIATE_S5)
|
||||
emit_immediate_s5(i915, i915->current.immediate[i]);
|
||||
else if (i == I915_IMMEDIATE_S6)
|
||||
emit_immediate_s6(i915, i915->current.immediate[i]);
|
||||
else
|
||||
OUT_BATCH(i915->current.immediate[i]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -168,8 +168,15 @@ static void upload_S6(struct i915_context *i915)
|
|||
|
||||
/* I915_NEW_BLEND
|
||||
*/
|
||||
if (i915->blend)
|
||||
LIS6 |= i915->blend->LIS6;
|
||||
if (i915->blend) {
|
||||
struct i915_surface *cbuf = i915_surface(i915->framebuffer.cbufs[0]);
|
||||
if (cbuf && cbuf->alpha_in_g)
|
||||
LIS6 |= i915->blend->LIS6_alpha_in_g;
|
||||
else if (cbuf && cbuf->alpha_is_x)
|
||||
LIS6 |= i915->blend->LIS6_alpha_is_x;
|
||||
else
|
||||
LIS6 |= i915->blend->LIS6;
|
||||
}
|
||||
|
||||
/* I915_NEW_DEPTH
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -351,6 +351,8 @@ i915_clear_depth_stencil_blitter(struct pipe_context *pipe,
|
|||
|
||||
static void i915_set_color_surface_swizzle(struct i915_surface *surf)
|
||||
{
|
||||
enum pipe_format format = surf->templ.format;
|
||||
|
||||
const struct {
|
||||
enum pipe_format format;
|
||||
uint8_t color_swizzle[4];
|
||||
|
|
@ -358,13 +360,22 @@ static void i915_set_color_surface_swizzle(struct i915_surface *surf)
|
|||
} fixup_formats[] = {
|
||||
{ PIPE_FORMAT_R8G8B8A8_UNORM, {2, 1, 0, 3 }, 0x21030000 /* BGRA */},
|
||||
{ PIPE_FORMAT_R8G8B8X8_UNORM, {2, 1, 0, 3 }, 0x21030000 /* BGRX */},
|
||||
|
||||
/* These are rendered to using COLORBUF_8BIT, where the G channel written
|
||||
* by shader (and output by blending) is used.
|
||||
*/
|
||||
{ PIPE_FORMAT_L8_UNORM, {0, 0, 0, 0 }, 0x00030000 /* RRRA */},
|
||||
{ PIPE_FORMAT_I8_UNORM, {0, 0, 0, 0 }, 0x00030000 /* RRRA */},
|
||||
{ PIPE_FORMAT_A8_UNORM, {3, 3, 3, 3 }, 0x33330000 /* AAAA */},
|
||||
};
|
||||
|
||||
if (format == PIPE_FORMAT_A8_UNORM)
|
||||
surf->alpha_in_g = true;
|
||||
else if (util_format_is_rgbx_or_bgrx(format))
|
||||
surf->alpha_is_x = true;
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(fixup_formats); i++) {
|
||||
if (fixup_formats[i].format == surf->templ.format) {
|
||||
if (fixup_formats[i].format == format) {
|
||||
memcpy(surf->color_swizzle, fixup_formats[i].color_swizzle, sizeof(surf->color_swizzle));
|
||||
surf->oc_swizzle = fixup_formats[i].oc_swizzle;
|
||||
return;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue