[Mesa-dev] [PATCH 06/11] st/mesa: add atomic buffer support
Ilia Mirkin
imirkin at alum.mit.edu
Sun Sep 27 14:34:24 PDT 2015
On Sun, Sep 27, 2015 at 5:27 PM, Marek Olšák <maraeo at gmail.com> wrote:
> On Sun, Sep 27, 2015 at 11:10 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>> On Sun, Sep 27, 2015 at 2:48 PM, Marek Olšák <maraeo at gmail.com> wrote:
>>> Patches 2-5 are:
>>>> +static void st_bind_atomics(struct st_context *st,
>>>> + struct gl_shader_program *prog,
>>>> + unsigned shader_type)
>>>> +{
>>>> + unsigned i;
>>>> +
>>>> + if (!prog)
>>>> + return;
>>>> +
>>>> + for (i = 0; i < prog->NumAtomicBuffers; i++) {
>>>
>>> This loops over all atomic buffers in a shader program, which can
>>> contain 5 linked shader stages, so NumAtomicBuffers can be <=
>>> MaxCombinedAtomicBuffers. I don't think drivers can handle so many.
>>>
>>>> + struct gl_atomic_buffer_binding *binding =
>>>> + &st->ctx->AtomicBufferBindings[prog->AtomicBuffers[i].Binding];
>>>> + struct st_buffer_object *st_obj =
>>>> + st_buffer_object(binding->BufferObject);
>>>> + struct pipe_shader_buffer sb = {};
>>>> +
>>>> + pipe_resource_reference(&sb.buffer, st_obj->buffer);
>>>> + sb.buffer_offset = binding->Offset;
>>>> + sb.buffer_size = st_obj->buffer->width0 - binding->Offset;
>>>> +
>>>> + /* TODO: cso */
>>>
>>> You can remove the TODO. I don't see why this would need cso_context support.
>>>
>>>> + st->pipe->set_shader_buffers(st->pipe, shader_type,
>>>> + i /* XXX */, 1, &sb);
>>>
>>> What does this XXX mean? This needs a better comment at least.
>>
>> This is what I was alluding to in the cover letter... it needs to look
>> up the buffer index from somewhere, but it's not easily available.
>> Timothy has a patch to fix up intel, if that's deemed to be the right
>> solution, then I'll copy it in here as well. Perhaps I should just do
>> that now and update it later as necessary.
>
> We need tests to be able say for certain that it works before pushing.
>
>>>> @@ -3025,13 +3053,72 @@ glsl_to_tgsi_visitor::get_function_signature(ir_function_signature *sig)
>>>> }
>>>>
>>>> void
>>>> +glsl_to_tgsi_visitor::visit_atomic_counter_intrinsic(ir_call *ir)
>>>> +{
>>>> + const char *callee = ir->callee->function_name();
>>>> + ir_dereference *deref = static_cast<ir_dereference *>(
>>>> + ir->actual_parameters.get_head());
>>>> + ir_variable *location = deref->variable_referenced();
>>>> +
>>>> + /* XXX use accept */
>>>> + st_src_reg buffer(
>>>> + PROGRAM_SAMPLER, location->data.binding /* XXX */, GLSL_TYPE_ATOMIC_UINT);
>>>
>>> Why don't you use accept? What's the second XXX about?
>>
>> location->data.binding is wrong. I need the equivalent of the sampler
>> uniform lookup. But it's what i965 uses.
>
> I think we need a test for this.
We got one, and it fails :) On i965 as well, for that matter --
arb_shader_atomic_counters-semantics. I'll update this change with
Timothy's technique and make sure it works.
>
>>>> @@ -5063,6 +5163,19 @@ compile_tgsi_instruction(struct st_translate *t,
>>>> src, num_src);
>>>> return;
>>>>
>>>> + case TGSI_OPCODE_LOAD:
>>>> + case TGSI_OPCODE_STORE:
>>>> + case TGSI_OPCODE_ATOMUADD:
>>>> + /* XXX the other atomic ops */
>>>
>>> Do we care about other atomic ops for ARB_shader_atomic_counters? I
>>> think the extension only needs LOAD and ATOMUADD, so this XXX can be
>>> removed.
>>
>> For atomic counters that's it -- actually store isn't required
>> either.But I think I'm going to go the other way and add them all in
>> now instead. This will be necessary for SSBO.
>
> Alright.
>
> Marek
More information about the mesa-dev
mailing list