mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
FIXUP: Use 16-bit things for texture sizes
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16276>
This commit is contained in:
parent
38a0742f6a
commit
28333e039c
3 changed files with 62 additions and 25 deletions
|
|
@ -42,7 +42,7 @@
|
|||
#include "pan_bo.h"
|
||||
#include "panvk_cs.h"
|
||||
|
||||
#define PANVK_DESCRIPTOR_ALIGN 16
|
||||
#define PANVK_DESCRIPTOR_ALIGN 8
|
||||
|
||||
struct panvk_bview_desc {
|
||||
uint32_t elems;
|
||||
|
|
@ -56,28 +56,28 @@ panvk_fill_bview_desc(struct panvk_bview_desc *desc,
|
|||
}
|
||||
|
||||
struct panvk_image_desc {
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
uint32_t depth;
|
||||
uint16_t levels;
|
||||
uint16_t samples;
|
||||
uint16_t width;
|
||||
uint16_t height;
|
||||
uint16_t depth;
|
||||
uint8_t levels;
|
||||
uint8_t samples;
|
||||
};
|
||||
|
||||
static void
|
||||
panvk_fill_image_desc(struct panvk_image_desc *desc,
|
||||
struct panvk_image_view *view)
|
||||
{
|
||||
desc->width = view->vk.extent.width;
|
||||
desc->height = view->vk.extent.height;
|
||||
desc->depth = view->vk.extent.depth;
|
||||
desc->width = view->vk.extent.width - 1;
|
||||
desc->height = view->vk.extent.height - 1;
|
||||
desc->depth = view->vk.extent.depth - 1;
|
||||
desc->levels = view->vk.level_count;
|
||||
desc->samples = view->vk.image->samples;
|
||||
|
||||
/* Stick array layer count after the last valid size component */
|
||||
if (view->vk.image->image_type == VK_IMAGE_TYPE_1D)
|
||||
desc->height = view->vk.layer_count;
|
||||
desc->height = view->vk.layer_count - 1;
|
||||
else if (view->vk.image->image_type == VK_IMAGE_TYPE_2D)
|
||||
desc->depth = view->vk.layer_count;
|
||||
desc->depth = view->vk.layer_count - 1;
|
||||
}
|
||||
|
||||
VkResult
|
||||
|
|
|
|||
|
|
@ -378,6 +378,43 @@ load_resource_deref_desc(nir_builder *b, nir_deref_instr *deref,
|
|||
.range=~0);
|
||||
}
|
||||
|
||||
static nir_ssa_def *
|
||||
load_tex_img_size(nir_builder *b, nir_deref_instr *deref,
|
||||
enum glsl_sampler_dim dim,
|
||||
const struct apply_descriptors_ctx *ctx)
|
||||
{
|
||||
if (dim == GLSL_SAMPLER_DIM_BUF) {
|
||||
return load_resource_deref_desc(b, deref, 0, 1, 32, ctx);
|
||||
} else {
|
||||
nir_ssa_def *desc = load_resource_deref_desc(b, deref, 0, 4, 16, ctx);
|
||||
|
||||
/* The sizes are provided as 16-bit values with 1 subtracted so
|
||||
* convert to 32-bit and add 1.
|
||||
*/
|
||||
return nir_iadd_imm(b, nir_u2u32(b, desc), 1);
|
||||
}
|
||||
}
|
||||
|
||||
static nir_ssa_def *
|
||||
load_tex_img_levels(nir_builder *b, nir_deref_instr *deref,
|
||||
enum glsl_sampler_dim dim,
|
||||
const struct apply_descriptors_ctx *ctx)
|
||||
{
|
||||
assert(dim != GLSL_SAMPLER_DIM_BUF);
|
||||
nir_ssa_def *desc = load_resource_deref_desc(b, deref, 0, 4, 16, ctx);
|
||||
return nir_u2u32(b, nir_iand_imm(b, nir_channel(b, desc, 3), 0xff));
|
||||
}
|
||||
|
||||
static nir_ssa_def *
|
||||
load_tex_img_samples(nir_builder *b, nir_deref_instr *deref,
|
||||
enum glsl_sampler_dim dim,
|
||||
const struct apply_descriptors_ctx *ctx)
|
||||
{
|
||||
assert(dim != GLSL_SAMPLER_DIM_BUF);
|
||||
nir_ssa_def *desc = load_resource_deref_desc(b, deref, 0, 4, 16, ctx);
|
||||
return nir_u2u32(b, nir_ushr_imm(b, nir_channel(b, desc, 3), 8));
|
||||
}
|
||||
|
||||
static bool
|
||||
lower_tex(nir_builder *b, nir_tex_instr *tex,
|
||||
const struct apply_descriptors_ctx *ctx)
|
||||
|
|
@ -393,25 +430,21 @@ lower_tex(nir_builder *b, nir_tex_instr *tex,
|
|||
assert(tex_src_idx >= 0);
|
||||
nir_deref_instr *deref = nir_src_as_deref(tex->src[tex_src_idx].src);
|
||||
|
||||
assert(tex->dest.is_ssa);
|
||||
nir_ssa_def *desc = load_resource_deref_desc(b, deref, 0, 4, 32, ctx);
|
||||
const enum glsl_sampler_dim dim = tex->sampler_dim;
|
||||
|
||||
nir_ssa_def *res;
|
||||
switch (tex->op) {
|
||||
case nir_texop_txs:
|
||||
assert(tex->dest.ssa.num_components <= 3);
|
||||
res = nir_channels(b, desc,
|
||||
nir_component_mask(tex->dest.ssa.num_components));
|
||||
res = nir_channels(b, load_tex_img_size(b, deref, dim, ctx),
|
||||
nir_component_mask(tex->dest.ssa.num_components));
|
||||
break;
|
||||
case nir_texop_query_levels:
|
||||
assert(tex->dest.ssa.num_components == 1);
|
||||
res = nir_extract_u16(b, nir_channel(b, desc, 3),
|
||||
nir_imm_int(b, 0));
|
||||
res = load_tex_img_levels(b, deref, dim, ctx);
|
||||
break;
|
||||
case nir_texop_texture_samples:
|
||||
assert(tex->dest.ssa.num_components == 1);
|
||||
res = nir_extract_u16(b, nir_channel(b, desc, 3),
|
||||
nir_imm_int(b, 1));
|
||||
res = load_tex_img_samples(b, deref, dim, ctx);
|
||||
break;
|
||||
default:
|
||||
unreachable("Unsupported texture query op");
|
||||
|
|
@ -506,17 +539,17 @@ lower_img_intrinsic(nir_builder *b, nir_intrinsic_instr *intr,
|
|||
if (intr->intrinsic == nir_intrinsic_image_deref_size ||
|
||||
intr->intrinsic == nir_intrinsic_image_deref_samples) {
|
||||
assert(intr->dest.is_ssa);
|
||||
nir_ssa_def *desc = load_resource_deref_desc(b, deref, 0, 4, 32, ctx);
|
||||
|
||||
const enum glsl_sampler_dim dim = nir_intrinsic_image_dim(intr);
|
||||
|
||||
nir_ssa_def *res;
|
||||
switch (intr->intrinsic) {
|
||||
case nir_intrinsic_image_deref_size:
|
||||
res = nir_channels(b, desc,
|
||||
nir_component_mask(intr->dest.ssa.num_components));
|
||||
res = nir_channels(b, load_tex_img_size(b, deref, dim, ctx),
|
||||
nir_component_mask(intr->dest.ssa.num_components));
|
||||
break;
|
||||
case nir_intrinsic_image_deref_samples:
|
||||
res = nir_extract_u16(b, nir_channel(b, desc, 3),
|
||||
nir_imm_int(b, 1));
|
||||
res = load_tex_img_samples(b, deref, dim, ctx);
|
||||
break;
|
||||
default:
|
||||
unreachable("Unsupported image query op");
|
||||
|
|
|
|||
|
|
@ -396,6 +396,10 @@ panvk_per_arch(shader_create)(struct panvk_device *dev,
|
|||
panvk_lower_blend(pdev, nir, &inputs, blend_state, static_blend_constants);
|
||||
}
|
||||
|
||||
/* We need to lower nir_texop_txs with LOD before we lower descriptor
|
||||
* access because nir_texop_txs gets turned into a descriptor UBO read
|
||||
* and a bit of math by the descriptor lowering code.
|
||||
*/
|
||||
nir_lower_tex_options lower_tex_options = {
|
||||
.lower_txs_lod = true,
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue