[Mesa-dev] [PATCH 1/2] draw: fix undefined input handling some more...

Roland Scheidegger sroland at vmware.com
Fri Nov 4 00:31:17 UTC 2016


Am 03.11.2016 um 11:48 schrieb Nicolai Hähnle:
> On 03.11.2016 02:15, sroland at vmware.com wrote:
>> From: Roland Scheidegger <sroland at vmware.com>
>>
>> Previous fixes were incomplete - some code still iterated through the
>> number
>> of elements provided by velem layout instead of the number stored in
>> the key
>> (which is the same as the number defined by the vs). And also actually
>> accessed the elements from the layout directly instead of those in the
>> key.
>> This mismatch could still cause crashes.
>> (Besides, it is a very good idea to only use data stored in the key
>> anyway.)
> 
> Makes sense to me. It would make sense to pull the check for
> PIPE_FORMAT_NONE from generate_fetch into draw_llvm_generate for
> consistency between the two loops. Either way,
Ah yes that's nicer indeed. Thanks!
(As of this commit it's also no longer necessary to pass in draw to
generate_fetch so I've removed that as well.)

Roland


> 
> Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
> 
>> ---
>>  src/gallium/auxiliary/draw/draw_llvm.c | 77
>> ++++++++++++++++++----------------
>>  1 file changed, 40 insertions(+), 37 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c
>> b/src/gallium/auxiliary/draw/draw_llvm.c
>> index 2f82d9d..d5fc1c2 100644
>> --- a/src/gallium/auxiliary/draw/draw_llvm.c
>> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
>> @@ -1658,10 +1658,10 @@ draw_llvm_generate(struct draw_llvm *llvm,
>> struct draw_llvm_variant *variant,
>>     /*
>>      * Pre-calculate everything which is constant per shader invocation.
>>      */
>> -   for (j = 0; j < draw->pt.nr_vertex_elements; ++j) {
>> +   for (j = 0; j < key->nr_vertex_elements; ++j) {
>>        LLVMValueRef vb_buffer_offset, buffer_size;
>>        LLVMValueRef vb_info, vbuffer_ptr;
>> -      struct pipe_vertex_element *velem = &draw->pt.vertex_element[j];
>> +      struct pipe_vertex_element *velem = &key->vertex_element[j];
>>        LLVMValueRef vb_index =
>>           lp_build_const_int32(gallivm, velem->vertex_buffer_index);
>>        LLVMValueRef bsize = lp_build_const_int32(gallivm,
>> @@ -1669,41 +1669,44 @@ draw_llvm_generate(struct draw_llvm *llvm,
>> struct draw_llvm_variant *variant,
>>        LLVMValueRef src_offset = lp_build_const_int32(gallivm,
>>                                                       velem->src_offset);
>>
>> -      vbuffer_ptr = LLVMBuildGEP(builder, vbuffers_ptr, &vb_index, 1,
>> "");
>> -      vb_info = LLVMBuildGEP(builder, vb_ptr, &vb_index, 1, "");
>> -      vb_stride[j] = draw_jit_vbuffer_stride(gallivm, vb_info);
>> -      vb_buffer_offset = draw_jit_vbuffer_offset(gallivm, vb_info);
>> -      map_ptr[j] = draw_jit_dvbuffer_map(gallivm, vbuffer_ptr);
>> -      buffer_size = draw_jit_dvbuffer_size(gallivm, vbuffer_ptr);
>> -
>> -      ofbit[j] = NULL;
>> -      stride_fixed[j] = lp_build_uadd_overflow(gallivm,
>> vb_buffer_offset,
>> -                                               src_offset, &ofbit[j]);
>> -      buffer_size_adj[j] = lp_build_usub_overflow(gallivm,
>> buffer_size, bsize,
>> -                                                   &ofbit[j]);
>> -
>> -      if (velem->instance_divisor) {
>> -         /* Index is equal to the start instance plus the number of
>> current
>> -          * instance divided by the divisor. In this case we compute
>> it as:
>> -          * index = start_instance + (instance_id  / divisor)
>> -          */
>> -         LLVMValueRef current_instance;
>> -         current_instance = LLVMBuildUDiv(builder,
>> system_values.instance_id,
>> -                                          lp_build_const_int32(gallivm,
>> -                                                              
>> velem->instance_divisor),
>> -                                          "instance_divisor");
>> -         instance_index[j] = lp_build_uadd_overflow(gallivm,
>> start_instance,
>> -                                                    current_instance,
>> &ofbit[j]);
>> -      }
>> +      if (velem->src_format != PIPE_FORMAT_NONE) {
>> +         vbuffer_ptr = LLVMBuildGEP(builder, vbuffers_ptr, &vb_index,
>> 1, "");
>> +         vb_info = LLVMBuildGEP(builder, vb_ptr, &vb_index, 1, "");
>> +         vb_stride[j] = draw_jit_vbuffer_stride(gallivm, vb_info);
>> +         vb_buffer_offset = draw_jit_vbuffer_offset(gallivm, vb_info);
>> +         map_ptr[j] = draw_jit_dvbuffer_map(gallivm, vbuffer_ptr);
>> +         buffer_size = draw_jit_dvbuffer_size(gallivm, vbuffer_ptr);
>> +
>> +         ofbit[j] = NULL;
>> +         stride_fixed[j] = lp_build_uadd_overflow(gallivm,
>> vb_buffer_offset,
>> +                                                  src_offset,
>> &ofbit[j]);
>> +         buffer_size_adj[j] = lp_build_usub_overflow(gallivm,
>> buffer_size, bsize,
>> +                                                     &ofbit[j]);
>> +
>> +         if (velem->instance_divisor) {
>> +            /* Index is equal to the start instance plus the number
>> of current
>> +             * instance divided by the divisor. In this case we
>> compute it as:
>> +             * index = start_instance + (instance_id  / divisor)
>> +             */
>> +            LLVMValueRef current_instance;
>> +            current_instance = LLVMBuildUDiv(builder,
>> system_values.instance_id,
>> +                                            
>> lp_build_const_int32(gallivm,
>> +                                                                 
>> velem->instance_divisor),
>> +                                             "instance_divisor");
>> +            instance_index[j] = lp_build_uadd_overflow(gallivm,
>> start_instance,
>> +                                                      
>> current_instance, &ofbit[j]);
>> +         }
>>
>> -      if (0) {
>> -         lp_build_printf(gallivm, "vbuf index = %u, vb_stride is %u\n",
>> -                         vb_index, vb_stride[j]);
>> -         lp_build_printf(gallivm, "   vb_buffer_offset = %u,
>> src_offset is %u\n",
>> -                         vb_buffer_offset, src_offset);
>> -         lp_build_print_value(gallivm, "   blocksize = ", bsize);
>> -         lp_build_printf(gallivm, "   instance_id = %u\n",
>> system_values.instance_id);
>> -         lp_build_printf(gallivm, "   buffer size = %u\n", buffer_size);
>> +         if (0) {
>> +            lp_build_printf(gallivm, "vbuf index = %u, vb_stride is
>> %u\n",
>> +                            vb_index, vb_stride[j]);
>> +            lp_build_printf(gallivm, "   vb_buffer_offset = %u,
>> src_offset is %u\n",
>> +                            vb_buffer_offset, src_offset);
>> +            lp_build_print_value(gallivm, "   blocksize = ", bsize);
>> +            lp_build_printf(gallivm, "   instance_id = %u\n",
>> +                            system_values.instance_id);
>> +            lp_build_printf(gallivm, "   buffer size = %u\n",
>> buffer_size);
>> +         }
>>        }
>>     }
>>
>> @@ -1782,7 +1785,7 @@ draw_llvm_generate(struct draw_llvm *llvm,
>> struct draw_llvm_variant *variant,
>>        }
>>
>>        for (j = 0; j < key->nr_vertex_elements; ++j) {
>> -         struct pipe_vertex_element *velem =
>> &draw->pt.vertex_element[j];
>> +         struct pipe_vertex_element *velem = &key->vertex_element[j];
>>           const struct util_format_description *format_desc =
>>              util_format_description(velem->src_format);
>>
>>



More information about the mesa-dev mailing list