Re: [Mesa-dev] [PATCH 6/7] radeonsi/nir: add initial bindless image support

2018-02-20 Thread Marek Olšák
On Tue, Feb 20, 2018 at 4:42 AM, Timothy Arceri  wrote:
> ---
>  src/gallium/drivers/radeonsi/si_shader_nir.c | 41 
> +++-
>  1 file changed, 34 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c 
> b/src/gallium/drivers/radeonsi/si_shader_nir.c
> index c2036a1509..e3e71c6eb6 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_nir.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
> @@ -771,6 +771,21 @@ si_nir_lookup_interp_param(struct ac_shader_abi *abi,
> LLVMGetParam(ctx->main_fn, interp_param_idx) : NULL;
>  }
>
> +static LLVMValueRef
> +get_bindless_index(struct ac_shader_abi *abi,
> +   struct si_shader_context *ctx, LLVMValueRef index)
> +{
> +   LLVMValueRef offset =
> +   LLVMBuildMul(ctx->ac.builder, index, LLVMConstInt(ctx->i32, 
> 16, 0), "");
> +
> +   index = abi->load_ubo(abi, ctx->ac.i32_0);
> +
> +   LLVMValueRef ret = ac_build_buffer_load(>ac, index, 1, NULL, 
> offset,
> +   NULL, 0, false, false, true, 
> true);

I don't understand this. At least I think it shouldn't use load_ubo
and ac_build_buffer_load. A bindless variable (index) is a 64-bit
integer, i.e. the same size as vec2.

Marek
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 6/7] radeonsi/nir: add initial bindless image support

2018-02-19 Thread Timothy Arceri
---
 src/gallium/drivers/radeonsi/si_shader_nir.c | 41 +++-
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c 
b/src/gallium/drivers/radeonsi/si_shader_nir.c
index c2036a1509..e3e71c6eb6 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -771,6 +771,21 @@ si_nir_lookup_interp_param(struct ac_shader_abi *abi,
LLVMGetParam(ctx->main_fn, interp_param_idx) : NULL;
 }
 
+static LLVMValueRef
+get_bindless_index(struct ac_shader_abi *abi,
+   struct si_shader_context *ctx, LLVMValueRef index)
+{
+   LLVMValueRef offset =
+   LLVMBuildMul(ctx->ac.builder, index, LLVMConstInt(ctx->i32, 16, 
0), "");
+
+   index = abi->load_ubo(abi, ctx->ac.i32_0);
+
+   LLVMValueRef ret = ac_build_buffer_load(>ac, index, 1, NULL, 
offset,
+   NULL, 0, false, false, true, 
true);
+
+   return LLVMBuildBitCast(ctx->ac.builder, ret, ctx->i32, "");
+}
+
 static LLVMValueRef
 si_nir_load_sampler_desc(struct ac_shader_abi *abi,
 unsigned descriptor_set, unsigned base_index,
@@ -780,8 +795,10 @@ si_nir_load_sampler_desc(struct ac_shader_abi *abi,
 {
struct si_shader_context *ctx = si_shader_context_from_abi(abi);
LLVMBuilderRef builder = ctx->ac.builder;
-   LLVMValueRef list = LLVMGetParam(ctx->main_fn, 
ctx->param_samplers_and_images);
LLVMValueRef index = dynamic_index;
+   LLVMValueRef list = bindless ?
+   LLVMGetParam(ctx->main_fn, 
ctx->param_bindless_samplers_and_images) :
+   LLVMGetParam(ctx->main_fn, ctx->param_samplers_and_images);
 
assert(!descriptor_set);
 
@@ -794,14 +811,24 @@ si_nir_load_sampler_desc(struct ac_shader_abi *abi,
 
if (image) {
assert(desc_type == AC_DESC_IMAGE || desc_type == 
AC_DESC_BUFFER);
-   assert(base_index + constant_index < ctx->num_images);
 
-   if (dynamic_index)
-   index = si_llvm_bound_index(ctx, index, 
ctx->num_images);
+   if (bindless) {
+   LLVMValueRef ret = get_bindless_index(abi, ctx, index);
 
-   index = LLVMBuildSub(ctx->gallivm.builder,
-LLVMConstInt(ctx->i32, SI_NUM_IMAGES - 1, 
0),
-index, "");
+   /* For simplicity, bindless image descriptors use fixed
+* 16-dword slots for now.
+*/
+   index = LLVMBuildMul(ctx->ac.builder, ret,
+LLVMConstInt(ctx->i32, 2, 0), "");
+   } else {
+   assert(base_index + constant_index < ctx->num_images);
+   if (dynamic_index)
+   index = si_llvm_bound_index(ctx, index, 
ctx->num_images);
+
+   index = LLVMBuildSub(ctx->gallivm.builder,
+LLVMConstInt(ctx->i32, 
SI_NUM_IMAGES - 1, 0),
+index, "");
+   }
 
/* TODO: be smarter about when we use dcc_off */
return si_load_image_desc(ctx, list, index, desc_type, write);
-- 
2.14.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev