From 0bc222706d3ba1ebddf9e9b90197a4fea5f71139 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 15 Jul 2020 13:51:18 -0400 Subject: [PATCH] zink: implement ARB_texture_query_lod just needed hooking up the spirv function to the tex op Reviewed-by: Erik Faye-Lund Part-of: --- docs/features.txt | 2 +- .../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: