diff --git a/src/gallium/drivers/d3d12/d3d12_blit.cpp b/src/gallium/drivers/d3d12/d3d12_blit.cpp index 55a741a6bce..e87ef87e750 100644 --- a/src/gallium/drivers/d3d12/d3d12_blit.cpp +++ b/src/gallium/drivers/d3d12/d3d12_blit.cpp @@ -69,7 +69,8 @@ resolve_supported(const struct pipe_blit_info *info) return false; } else { if (util_format_get_mask(info->dst.format) != info->mask || - util_format_get_mask(info->src.format) != info->mask) + util_format_get_mask(info->src.format) != info->mask || + util_format_has_alpha1(info->src.format)) return false; } diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp index d09315a5093..7cac481de20 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context.cpp @@ -1697,6 +1697,10 @@ d3d12_clear_render_target(struct pipe_context *pctx, clear_color[c] = color->f[c]; } + if (!(util_format_colormask(util_format_description(psurf->texture->format)) & + PIPE_MASK_A)) + clear_color[3] = 1.0f; + D3D12_RECT rect = { (int)dstx, (int)dsty, (int)dstx + (int)width, (int)dsty + (int)height }; diff --git a/src/gallium/drivers/d3d12/d3d12_format.c b/src/gallium/drivers/d3d12/d3d12_format.c index 1a871029f52..d49c3b00c1f 100644 --- a/src/gallium/drivers/d3d12/d3d12_format.c +++ b/src/gallium/drivers/d3d12/d3d12_format.c @@ -63,6 +63,16 @@ static const DXGI_FORMAT formats[PIPE_FORMAT_COUNT] = { MAP_FORMAT_INT(R8G8B8A8) MAP_FORMAT_SRGB(R8G8B8A8) + /* Since we report PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND and other caps, + * we can rely on st/mesa to force the alpha to 1 for these, so we can + * just use RGBA. This is needed to support RGB configs, since some apps + * will only choose RGB (not RGBA) configs. + */ + [PIPE_FORMAT_R8G8B8X8_UNORM] = DXGI_FORMAT_R8G8B8A8_UNORM, + [PIPE_FORMAT_R8G8B8X8_SNORM] = DXGI_FORMAT_R8G8B8A8_SNORM, + [PIPE_FORMAT_R8G8B8X8_UINT] = DXGI_FORMAT_R8G8B8A8_UINT, + [PIPE_FORMAT_R8G8B8X8_SINT] = DXGI_FORMAT_R8G8B8A8_SINT, + [PIPE_FORMAT_B8G8R8X8_UNORM] = DXGI_FORMAT_B8G8R8X8_UNORM, [PIPE_FORMAT_B8G8R8A8_UNORM] = DXGI_FORMAT_B8G8R8A8_UNORM, @@ -238,6 +248,8 @@ d3d12_get_format_info(enum pipe_format pformat, enum pipe_texture_target target) * but the shader will read the x component so we need to adjust the swizzle. */ plane_slice = 1; swizzle = STENCIL_SWIZZLE; + } else if (util_format_has_alpha1(pformat)) { + swizzle = RGB1_SWIZZLE; } }