anv: Make border colors the right size and alignment on HSW
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
51076eb87c
commit
58cb865313
|
@ -1880,6 +1880,25 @@ anv_state_pool_emit_data(struct anv_state_pool *pool, size_t size, size_t align,
|
|||
return state;
|
||||
}
|
||||
|
||||
/* Haswell border color is a bit of a disaster. Float and unorm formats use a
|
||||
* straightforward 32-bit float color in the first 64 bytes. Instead of using
|
||||
* a nice float/integer union like Gen8+, Haswell specifies the integer border
|
||||
* color as a separate entry /after/ the float color. The layout of this entry
|
||||
* also depends on the format's bpp (with extra hacks for RG32), and overlaps.
|
||||
*
|
||||
* Since we don't know the format/bpp, we can't make any of the border colors
|
||||
* containing '1' work for all formats, as it would be in the wrong place for
|
||||
* some of them. We opt to make 32-bit integers work as this seems like the
|
||||
* most common option. Fortunately, transparent black works regardless, as
|
||||
* all zeroes is the same in every bit-size.
|
||||
*/
|
||||
struct hsw_border_color {
|
||||
float float32[4];
|
||||
uint32_t _pad0[12];
|
||||
uint32_t uint32[4];
|
||||
uint32_t _pad1[108];
|
||||
};
|
||||
|
||||
struct gen8_border_color {
|
||||
union {
|
||||
float float32[4];
|
||||
|
@ -1892,18 +1911,33 @@ struct gen8_border_color {
|
|||
static void
|
||||
anv_device_init_border_colors(struct anv_device *device)
|
||||
{
|
||||
static const struct gen8_border_color border_colors[] = {
|
||||
[VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 0.0 } },
|
||||
[VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 1.0 } },
|
||||
[VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE] = { .float32 = { 1.0, 1.0, 1.0, 1.0 } },
|
||||
[VK_BORDER_COLOR_INT_TRANSPARENT_BLACK] = { .uint32 = { 0, 0, 0, 0 } },
|
||||
[VK_BORDER_COLOR_INT_OPAQUE_BLACK] = { .uint32 = { 0, 0, 0, 1 } },
|
||||
[VK_BORDER_COLOR_INT_OPAQUE_WHITE] = { .uint32 = { 1, 1, 1, 1 } },
|
||||
};
|
||||
if (device->info.is_haswell) {
|
||||
static const struct hsw_border_color border_colors[] = {
|
||||
[VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 0.0 } },
|
||||
[VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 1.0 } },
|
||||
[VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE] = { .float32 = { 1.0, 1.0, 1.0, 1.0 } },
|
||||
[VK_BORDER_COLOR_INT_TRANSPARENT_BLACK] = { .uint32 = { 0, 0, 0, 0 } },
|
||||
[VK_BORDER_COLOR_INT_OPAQUE_BLACK] = { .uint32 = { 0, 0, 0, 1 } },
|
||||
[VK_BORDER_COLOR_INT_OPAQUE_WHITE] = { .uint32 = { 1, 1, 1, 1 } },
|
||||
};
|
||||
|
||||
device->border_colors = anv_state_pool_emit_data(&device->dynamic_state_pool,
|
||||
sizeof(border_colors), 64,
|
||||
border_colors);
|
||||
device->border_colors =
|
||||
anv_state_pool_emit_data(&device->dynamic_state_pool,
|
||||
sizeof(border_colors), 512, border_colors);
|
||||
} else {
|
||||
static const struct gen8_border_color border_colors[] = {
|
||||
[VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 0.0 } },
|
||||
[VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 1.0 } },
|
||||
[VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE] = { .float32 = { 1.0, 1.0, 1.0, 1.0 } },
|
||||
[VK_BORDER_COLOR_INT_TRANSPARENT_BLACK] = { .uint32 = { 0, 0, 0, 0 } },
|
||||
[VK_BORDER_COLOR_INT_OPAQUE_BLACK] = { .uint32 = { 0, 0, 0, 1 } },
|
||||
[VK_BORDER_COLOR_INT_OPAQUE_WHITE] = { .uint32 = { 1, 1, 1, 1 } },
|
||||
};
|
||||
|
||||
device->border_colors =
|
||||
anv_state_pool_emit_data(&device->dynamic_state_pool,
|
||||
sizeof(border_colors), 64, border_colors);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -341,8 +341,10 @@ VkResult genX(CreateSampler)(
|
|||
|
||||
sampler->n_planes = 1;
|
||||
|
||||
uint32_t border_color_stride = GEN_IS_HASWELL ? 512 : 64;
|
||||
uint32_t border_color_offset = device->border_colors.offset +
|
||||
pCreateInfo->borderColor * 64;
|
||||
pCreateInfo->borderColor *
|
||||
border_color_stride;
|
||||
|
||||
#if GEN_GEN >= 9
|
||||
unsigned sampler_reduction_mode = STD_FILTER;
|
||||
|
|
Loading…
Reference in New Issue