Mesa (master): zink: implement ARB_texture_query_lod
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Nov 6 23:16:01 UTC 2020
Module: Mesa
Branch: master
Commit: 0bc222706d3ba1ebddf9e9b90197a4fea5f71139
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0bc222706d3ba1ebddf9e9b90197a4fea5f71139
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Wed Jul 15 13:51:18 2020 -0400
zink: implement ARB_texture_query_lod
just needed hooking up the spirv function to the tex op
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7484>
---
docs/features.txt | 2 +-
src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c | 11 +++++++++--
.../drivers/zink/nir_to_spirv/spirv_builder.c | 20 ++++++++++++++++++++
.../drivers/zink/nir_to_spirv/spirv_builder.h | 6 ++++++
src/gallium/drivers/zink/zink_screen.c | 1 +
5 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/docs/features.txt b/docs/features.txt
index 9d966b5007a..c5211b5cf42 100644
--- a/docs/features.txt
+++ b/docs/features.txt
@@ -135,7 +135,7 @@ GL 4.0, GLSL 4.00 --- all DONE: i965/gen7+, nvc0, r600, radeonsi, llvmpipe, virg
GL_ARB_texture_buffer_object_rgb32 DONE (freedreno, i965/gen6+, softpipe, swr)
GL_ARB_texture_cube_map_array DONE (i965/gen6+, nv50, softpipe, swr, zink)
GL_ARB_texture_gather DONE (freedreno, i965/gen6+, nv50, softpipe, swr, v3d, panfrost)
- GL_ARB_texture_query_lod DONE (freedreno, i965, nv50, softpipe, swr, v3d, panfrost)
+ GL_ARB_texture_query_lod DONE (freedreno, i965, nv50, softpipe, swr, v3d, panfrost, zink)
GL_ARB_transform_feedback2 DONE (i965/gen6+, nv50, softpipe, swr, v3d, panfrost)
GL_ARB_transform_feedback3 DONE (i965/gen7+, softpipe, swr)
diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 5a54caa1a35..b2021694c19 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -1862,7 +1862,8 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
tex->op == nir_texop_txd ||
tex->op == nir_texop_txf ||
tex->op == nir_texop_txf_ms ||
- tex->op == nir_texop_txs);
+ tex->op == nir_texop_txs ||
+ tex->op == nir_texop_lod);
assert(tex->texture_index == tex->sampler_index);
SpvId coord = 0, proj = 0, bias = 0, lod = 0, dref = 0, dx = 0, dy = 0,
@@ -1983,7 +1984,13 @@ emit_tex(struct ntv_context *ctx, nir_tex_instr *tex)
constituents,
coord_components);
}
-
+ if (tex->op == nir_texop_lod) {
+ SpvId result = spirv_builder_emit_image_query_lod(&ctx->builder,
+ dest_type, load,
+ coord);
+ store_dest(ctx, &tex->dest, result, tex->dest_type);
+ return;
+ }
SpvId actual_dest_type = dest_type;
if (dref)
actual_dest_type = spirv_builder_type_float(&ctx->builder, 32);
diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
index cc361a0916a..f82ea821e2a 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
@@ -758,6 +758,26 @@ spirv_builder_emit_image_query_size(struct spirv_builder *b,
return result;
}
+SpvId
+spirv_builder_emit_image_query_lod(struct spirv_builder *b,
+ SpvId result_type,
+ SpvId image,
+ SpvId coords)
+{
+ int opcode = SpvOpImageQueryLod;
+ int words = 5;
+
+ SpvId result = spirv_builder_new_id(b);
+ spirv_buffer_prepare(&b->instructions, b->mem_ctx, words);
+ spirv_buffer_emit_word(&b->instructions, opcode | (words << 16));
+ spirv_buffer_emit_word(&b->instructions, result_type);
+ spirv_buffer_emit_word(&b->instructions, result);
+ spirv_buffer_emit_word(&b->instructions, image);
+ spirv_buffer_emit_word(&b->instructions, coords);
+
+ return result;
+}
+
SpvId
spirv_builder_emit_ext_inst(struct spirv_builder *b, SpvId result_type,
SpvId set, uint32_t instruction,
diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
index 99128919e37..5ed0d461eab 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
@@ -267,6 +267,12 @@ spirv_builder_emit_image_query_size(struct spirv_builder *b,
SpvId image,
SpvId lod);
+SpvId
+spirv_builder_emit_image_query_lod(struct spirv_builder *b,
+ SpvId result_type,
+ SpvId image,
+ SpvId coords);
+
SpvId
spirv_builder_emit_ext_inst(struct spirv_builder *b, SpvId result_type,
SpvId set, uint32_t instruction,
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index b15dbfd5667..96c6945f977 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -99,6 +99,7 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_NPOT_TEXTURES:
case PIPE_CAP_TGSI_TEXCOORD:
case PIPE_CAP_DRAW_INDIRECT:
+ case PIPE_CAP_TEXTURE_QUERY_LOD:
return 1;
case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
More information about the mesa-commit
mailing list