region.srcOffsets[1].y = info->src.box.y + info->src.box.height;
enum pipe_texture_target src_target = src->base.b.target;
- if (src->need_2D_zs)
+ if (src->need_2D)
src_target = src_target == PIPE_TEXTURE_1D ? PIPE_TEXTURE_2D : PIPE_TEXTURE_2D_ARRAY;
switch (src_target) {
case PIPE_TEXTURE_CUBE:
assert(region.dstOffsets[0].y != region.dstOffsets[1].y);
enum pipe_texture_target dst_target = dst->base.b.target;
- if (dst->need_2D_zs)
+ if (dst->need_2D)
dst_target = dst_target == PIPE_TEXTURE_1D ? PIPE_TEXTURE_2D : PIPE_TEXTURE_2D_ARRAY;
switch (dst_target) {
case PIPE_TEXTURE_CUBE:
static bool
convert_1d_shadow_tex(nir_builder *b, nir_instr *instr, void *data)
{
+ struct zink_screen *screen = data;
if (instr->type != nir_instr_type_tex)
return false;
nir_tex_instr *tex = nir_instr_as_tex(instr);
if (tex->sampler_dim != GLSL_SAMPLER_DIM_1D || !tex->is_shadow)
return false;
+ if (tex->is_sparse && screen->need_2D_sparse) {
+ /* no known case of this exists: only nvidia can hit it, and nothing uses it */
+ mesa_loge("unhandled/unsupported 1D sparse texture!");
+ abort();
+ }
tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
b->cursor = nir_before_instr(instr);
tex->coord_components++;
}
static bool
-lower_1d_shadow(nir_shader *shader)
+lower_1d_shadow(nir_shader *shader, struct zink_screen *screen)
{
bool found = false;
nir_foreach_variable_with_modes(var, shader, nir_var_uniform | nir_var_image) {
found = true;
}
if (found)
- nir_shader_instructions_pass(shader, convert_1d_shadow_tex, nir_metadata_dominance, NULL);
+ nir_shader_instructions_pass(shader, convert_1d_shadow_tex, nir_metadata_dominance, screen);
return found;
}
NIR_PASS_V(nir, lower_sparse);
if (screen->need_2D_zs)
- NIR_PASS_V(nir, lower_1d_shadow);
+ NIR_PASS_V(nir, lower_1d_shadow, screen);
{
nir_lower_subgroups_options subgroup_options = {0};
region.bufferImageHeight = 0;
region.imageSubresource.mipLevel = buf2img ? dst_level : src_level;
enum pipe_texture_target img_target = img->base.b.target;
- if (img->need_2D_zs)
+ if (img->need_2D)
img_target = img_target == PIPE_TEXTURE_1D ? PIPE_TEXTURE_2D : PIPE_TEXTURE_2D_ARRAY;
switch (img_target) {
case PIPE_TEXTURE_CUBE:
region.srcSubresource.aspectMask = src->aspect;
region.srcSubresource.mipLevel = src_level;
enum pipe_texture_target src_target = src->base.b.target;
- if (src->need_2D_zs)
+ if (src->need_2D)
src_target = src_target == PIPE_TEXTURE_1D ? PIPE_TEXTURE_2D : PIPE_TEXTURE_2D_ARRAY;
switch (src_target) {
case PIPE_TEXTURE_CUBE:
region.dstSubresource.aspectMask = dst->aspect;
region.dstSubresource.mipLevel = dst_level;
enum pipe_texture_target dst_target = dst->base.b.target;
- if (dst->need_2D_zs)
+ if (dst->need_2D)
dst_target = dst_target == PIPE_TEXTURE_1D ? PIPE_TEXTURE_2D : PIPE_TEXTURE_2D_ARRAY;
switch (dst_target) {
case PIPE_TEXTURE_CUBE:
if (templ->flags & PIPE_RESOURCE_FLAG_SPARSE)
ici->flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT;
- bool need_2D_zs = false;
+ bool need_2D = false;
switch (templ->target) {
case PIPE_TEXTURE_1D:
case PIPE_TEXTURE_1D_ARRAY:
- need_2D_zs = screen->need_2D_zs && util_format_is_depth_or_stencil(templ->format);
- ici->imageType = need_2D_zs ? VK_IMAGE_TYPE_2D : VK_IMAGE_TYPE_1D;
+ if (templ->flags & PIPE_RESOURCE_FLAG_SPARSE)
+ need_2D |= screen->need_2D_sparse;
+ if (util_format_is_depth_or_stencil(templ->format))
+ need_2D |= screen->need_2D_zs;
+ ici->imageType = need_2D ? VK_IMAGE_TYPE_2D : VK_IMAGE_TYPE_1D;
break;
case PIPE_TEXTURE_CUBE:
res->base.b.nr_sparse_levels = res->sparse.imageMipTailFirstLod;
}
res->format = zink_get_format(screen, templ->format);
- res->need_2D_zs = screen->need_2D_zs && util_format_is_depth_or_stencil(templ->format) &&
- (templ->target == PIPE_TEXTURE_1D || templ->target == PIPE_TEXTURE_1D_ARRAY);
+ if (templ->target == PIPE_TEXTURE_1D || templ->target == PIPE_TEXTURE_1D_ARRAY) {
+ res->need_2D = (screen->need_2D_zs && util_format_is_depth_or_stencil(templ->format)) ||
+ (screen->need_2D_sparse && (templ->flags & PIPE_RESOURCE_FLAG_SPARSE));
+ }
res->dmabuf_acquire = whandle && whandle->type == WINSYS_HANDLE_TYPE_FD;
res->layout = res->dmabuf_acquire ? VK_IMAGE_LAYOUT_PREINITIALIZED : VK_IMAGE_LAYOUT_UNDEFINED;
res->optimal_tiling = optimal_tiling;
VkImageLayout layout;
VkImageAspectFlags aspect;
bool optimal_tiling;
- bool need_2D_zs;
+ bool need_2D;
uint8_t fb_binds; //not counted in all_binds
};
};
mesa_loge("ZINK: vkGetPhysicalDeviceImageFormatProperties failed");
}
screen->need_2D_zs = ret != VK_SUCCESS;
+
+ if (screen->info.feats.features.sparseResidencyImage2D)
+ screen->need_2D_sparse = !screen->base.get_sparse_texture_virtual_page_size(&screen->base, PIPE_TEXTURE_1D, false, PIPE_FORMAT_R32_FLOAT, 0, 16, NULL, NULL, NULL);
}
bool
VkImageType type;
switch (target) {
case PIPE_TEXTURE_1D:
- type = screen->need_2D_zs && is_zs ? VK_IMAGE_TYPE_2D : VK_IMAGE_TYPE_1D;
+ type = (screen->need_2D_sparse || (screen->need_2D_zs && is_zs)) ? VK_IMAGE_TYPE_2D : VK_IMAGE_TYPE_1D;
break;
case PIPE_TEXTURE_2D:
bool have_D24_UNORM_S8_UINT;
bool have_triangle_fans;
bool need_2D_zs;
+ bool need_2D_sparse;
bool faked_e5sparse; //drivers may not expose R9G9B9E5 but cts requires it
uint32_t gfx_queue;
switch (target) {
case PIPE_TEXTURE_1D:
- ivci.viewType = res->need_2D_zs ? VK_IMAGE_VIEW_TYPE_2D : VK_IMAGE_VIEW_TYPE_1D;
+ ivci.viewType = res->need_2D ? VK_IMAGE_VIEW_TYPE_2D : VK_IMAGE_VIEW_TYPE_1D;
break;
case PIPE_TEXTURE_1D_ARRAY:
- ivci.viewType = res->need_2D_zs ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_1D_ARRAY;
+ ivci.viewType = res->need_2D ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_1D_ARRAY;
break;
case PIPE_TEXTURE_2D: