llvmpipe: enable stencil only formats. (v2)

This fixes two bugs, one in clearing and one in sign extensions
for S8 only types, and enables it for use.

These are useful for vulkan support later.

v2: move casting to same place as Z casting.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4574>
This commit is contained in:
Dave Airlie 2019-12-03 16:01:37 +10:00
parent 65906d1331
commit 024b5dfc1c
3 changed files with 11 additions and 6 deletions

View File

@ -599,6 +599,12 @@ lp_build_depth_stencil_load_swizzled(struct gallivm_state *gallivm,
LLVMConstVector(shuffles, zs_type.length), "");
*s_fb = *z_fb;
if (format_desc->block.bits == 8) {
/* Extend stencil-only 8 bit values (S8_UINT) */
*s_fb = LLVMBuildZExt(builder, *s_fb,
lp_build_int_vec_type(gallivm, z_src_type), "");
}
if (format_desc->block.bits < z_src_type.width) {
/* Extend destination ZS values (e.g., when reading from Z16_UNORM) */
*z_fb = LLVMBuildZExt(builder, *z_fb,

View File

@ -211,7 +211,11 @@ lp_rast_clear_zstencil(struct lp_rasterizer_task *task,
switch (block_size) {
case 1:
assert(clear_mask == 0xff);
memset(dst, (uint8_t) clear_value, height * width);
for (i = 0; i < height; i++) {
uint8_t *row = (uint8_t *)dst;
memset(row, (uint8_t) clear_value, width);
dst += dst_stride;
}
break;
case 2:
if (clear_mask == 0xffff) {

View File

@ -733,11 +733,6 @@ llvmpipe_is_format_supported( struct pipe_screen *_screen,
if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
return false;
/* TODO: Support stencil-only formats */
if (format_desc->swizzle[0] == PIPE_SWIZZLE_NONE) {
return false;
}
}
if (format_desc->layout == UTIL_FORMAT_LAYOUT_ASTC ||