[Mesa-dev] [PATCH] gallium: add basevertex and vertexid_zerobase semantics
Ilia Mirkin
imirkin at alum.mit.edu
Mon Oct 13 11:52:29 PDT 2014
Roland, is this the extension you were looking for?
https://www.opengl.org/registry/specs/ARB/shader_draw_parameters.txt
On Mon, Oct 13, 2014 at 2:44 PM, Roland Scheidegger <sroland at vmware.com> wrote:
> Oh I actually thought that BASEVERTEX was available as an vs input in some
> gl extension. Looks like that's not the case.
> Still, I guess we'd need some cap bit so we can tell the glsl compiler if it
> actually should lower vertexid to vertexid_zerobase + basevertex or not. And
> even then that still wouldn't cover drivers that don't want it lowered if
> they can do the vertexid_zerobase thing (though it should not be an issue
> with mesa state tracker as it would never use it).
>
> Roland
>
>
>
> On 10/13/2014 02:14 AM, Marek Olšák wrote:
>>
>> radeonsi supports VERTEXID_ZEROBASE and BASEVERTEX. VERTEXID can be
>> implemented trivially using the two. I don't think we need any cap
>> bits, because this is required by OpenGL. In the worst case, drivers
>> will have to store BASEVERTEX in a constant buffer.
>>
>> Marek
>>
>> On Mon, Oct 13, 2014 at 9:45 AM, <sroland at vmware.com> wrote:
>>>
>>> From: Roland Scheidegger <sroland at vmware.com>
>>>
>>> Just like in core mesa, expose a separate vertexid which doesn't include
>>> the base vertex (aka d3d10 style). And expose basevertex too (vertexid is
>>> basevertex + vertexid_zerobase). This will be needed to fix the piglit
>>> vertexid failures in draw due to it following d3d10 semantics with
>>> vertexid
>>> (this patch does not actually fix that yet).
>>>
>>> XXX: what cap bits do we want?
>>> ---
>>> src/gallium/auxiliary/draw/draw_llvm.c | 8 +++++-
>>> src/gallium/auxiliary/gallivm/lp_bld_tgsi.h | 1 +
>>> src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 5 ++++
>>> src/gallium/auxiliary/tgsi/tgsi_strings.c | 2 ++
>>> src/gallium/docs/source/tgsi.rst | 36
>>> +++++++++++++++++++++++++
>>> src/gallium/include/pipe/p_shader_tokens.h | 4 ++-
>>> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 8 ++++--
>>> 7 files changed, 60 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c
>>> b/src/gallium/auxiliary/draw/draw_llvm.c
>>> index 14c802b..073b8ef 100644
>>> --- a/src/gallium/auxiliary/draw/draw_llvm.c
>>> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
>>> @@ -1653,7 +1653,11 @@ draw_llvm_generate(struct draw_llvm *llvm, struct
>>> draw_llvm_variant *variant,
>>> lp_build_printf(gallivm, " --- io %d = %p, loop counter %d\n",
>>> io_itr, io, lp_loop.counter);
>>> #endif
>>> - system_values.vertex_id = lp_build_zero(gallivm,
>>> lp_type_uint_vec(32, 32*vector_length));
>>> + system_values.vertex_id = lp_build_zero(gallivm,
>>> + lp_type_uint_vec(32,
>>> 32*vector_length));
>>> + system_values.basevertex = lp_build_broadcast(gallivm,
>>> lp_build_vec_type(gallivm,
>>> +
>>> lp_type_uint_vec(32, 32*vector_length)),
>>> + vertex_id_offset);
>>> for (i = 0; i < vector_length; ++i) {
>>> LLVMValueRef vert_index =
>>> LLVMBuildAdd(builder,
>>> @@ -1714,6 +1718,8 @@ draw_llvm_generate(struct draw_llvm *llvm, struct
>>> draw_llvm_variant *variant,
>>> * the primitive was split (we split rendering into chunks of
>>> at
>>> * most 4095-vertices) we need to back out the original start
>>> * index out of our vertex id here.
>>> + * XXX this is only true for d3d10 style vertex id otherwise
>>> should
>>> + * skip the sub.
>>> */
>>> vertex_id = LLVMBuildSub(builder, true_index,
>>> vertex_id_offset, "");
>>>
>>> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
>>> b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
>>> index 029ca3c..43a0feb 100644
>>> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
>>> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
>>> @@ -163,6 +163,7 @@ struct lp_bld_tgsi_system_values {
>>> LLVMValueRef instance_id;
>>> LLVMValueRef vertex_id;
>>> LLVMValueRef prim_id;
>>> + LLVMValueRef basevertex;
>>> };
>>>
>>>
>>> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
>>> b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
>>> index 05618bc..32c5a6f 100644
>>> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
>>> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
>>> @@ -1538,6 +1538,11 @@ emit_fetch_system_value(
>>> atype = TGSI_TYPE_UNSIGNED;
>>> break;
>>>
>>> + case TGSI_SEMANTIC_BASEVERTEX:
>>> + res = bld->system_values.basevertex;
>>> + atype = TGSI_TYPE_UNSIGNED;
>>> + break;
>>> +
>>> case TGSI_SEMANTIC_PRIMID:
>>> res = bld->system_values.prim_id;
>>> atype = TGSI_TYPE_UNSIGNED;
>>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c
>>> b/src/gallium/auxiliary/tgsi/tgsi_strings.c
>>> index f84cd79..77ef04c 100644
>>> --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c
>>> +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c
>>> @@ -86,6 +86,8 @@ const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] =
>>> "SAMPLEPOS",
>>> "SAMPLEMASK",
>>> "INVOCATIONID",
>>> + "VERTEXID_ZEROBASE",
>>> + "BASEVERTEX",
>>> };
>>>
>>> const char *tgsi_texture_names[TGSI_TEXTURE_COUNT] =
>>> diff --git a/src/gallium/docs/source/tgsi.rst
>>> b/src/gallium/docs/source/tgsi.rst
>>> index 7d5918f..d53e563 100644
>>> --- a/src/gallium/docs/source/tgsi.rst
>>> +++ b/src/gallium/docs/source/tgsi.rst
>>> @@ -2839,6 +2839,42 @@ For geometry shaders, this semantic label
>>> indicates that a system value
>>> contains the current invocation id (i.e. gl_InvocationID). Only the X
>>> value is
>>> used.
>>>
>>> +TGSI_SEMANTIC_INSTANCEID
>>> +""""""""""""""""""""""""
>>> +
>>> +For vertex shaders, this semantic label indicates that a system value
>>> contains
>>> +the current instance id (i.e. gl_InstanceID). It does not include the
>>> base
>>> +instance. Only the X value is used.
>>> +
>>> +TGSI_SEMANTIC_VERTEXID
>>> +""""""""""""""""""""""
>>> +
>>> +For vertex shaders, this semantic label indicates that a system value
>>> contains
>>> +the current vertex id (i.e. gl_VertexID). It does (unlike in d3d10)
>>> include the
>>> +base vertex. Only the X value is used.
>>> +
>>> +TGSI_SEMANTIC_VERTEXID_ZEROBASE
>>> +"""""""""""""""""""""""""""""""
>>> +
>>> +For vertex shaders, this semantic label indicates that a system value
>>> contains
>>> +the current vertex id without including the base vertex (this
>>> corresponds to
>>> +d3d10 vertex id, so TGSI_SEMANTIC_VERTEXID_ZEROBASE +
>>> TGSI_SEMANTIC_BASEVERTEX
>>> +== TGSI_SEMANTIC_VERTEXID). Only the X value is used.
>>> +
>>> +TGSI_SEMANTIC_BASEVERTEX
>>> +""""""""""""""""""""""""
>>> +
>>> +For vertex shaders, this semantic label indicates that a system value
>>> contains
>>> +the base vertex (i.e. gl_BaseVertex). Only the X value is used.
>>> +
>>> +TGSI_SEMANTIC_PRIMID
>>> +""""""""""""""""""""
>>> +
>>> +For geometry and fragment shaders, this semantic label indicates the
>>> value
>>> +contains the primitive id (i.e. gl_PrimitiveID). Only the X value is
>>> used.
>>> +FIXME: This right now can be either a ordinary input or a system
>>> value...
>>> +
>>> +
>>> Declaration Interpolate
>>> ^^^^^^^^^^^^^^^^^^^^^^^
>>>
>>> diff --git a/src/gallium/include/pipe/p_shader_tokens.h
>>> b/src/gallium/include/pipe/p_shader_tokens.h
>>> index df154a2..7a68387 100644
>>> --- a/src/gallium/include/pipe/p_shader_tokens.h
>>> +++ b/src/gallium/include/pipe/p_shader_tokens.h
>>> @@ -176,7 +176,9 @@ struct tgsi_declaration_interp
>>> #define TGSI_SEMANTIC_SAMPLEPOS 25
>>> #define TGSI_SEMANTIC_SAMPLEMASK 26
>>> #define TGSI_SEMANTIC_INVOCATIONID 27
>>> -#define TGSI_SEMANTIC_COUNT 28 /**< number of semantic values */
>>> +#define TGSI_SEMANTIC_VERTEXID_ZEROBASE 28
>>> +#define TGSI_SEMANTIC_BASEVERTEX 29
>>> +#define TGSI_SEMANTIC_COUNT 30 /**< number of semantic values */
>>>
>>> struct tgsi_declaration_semantic
>>> {
>>> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>>> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>>> index a0da9f6..872724c 100644
>>> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>>> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>>> @@ -4165,8 +4165,8 @@ const unsigned
>>> _mesa_sysval_to_semantic[SYSTEM_VALUE_MAX] = {
>>> */
>>> TGSI_SEMANTIC_VERTEXID,
>>> TGSI_SEMANTIC_INSTANCEID,
>>> - 0,
>>> - 0,
>>> + TGSI_SEMANTIC_VERTEXID_ZEROBASE,
>>> + TGSI_SEMANTIC_BASEVERTEX,
>>>
>>> /* Geometry shader
>>> */
>>> @@ -4866,6 +4866,10 @@ st_translate_program(
>>> TGSI_SEMANTIC_SAMPLEMASK);
>>> assert(_mesa_sysval_to_semantic[SYSTEM_VALUE_INVOCATION_ID] ==
>>> TGSI_SEMANTIC_INVOCATIONID);
>>> + assert(_mesa_sysval_to_semantic[SYSTEM_VALUE_VERTEX_ID_ZERO_BASE] ==
>>> + TGSI_SEMANTIC_VERTEXID_ZEROBASE);
>>> + assert(_mesa_sysval_to_semantic[SYSTEM_VALUE_BASE_VERTEX] ==
>>> + TGSI_SEMANTIC_BASEVERTEX);
>>>
>>> t = CALLOC_STRUCT(st_translate);
>>> if (!t) {
>>> --
>>> 1.9.1
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>>
>>> https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=F4msKE2WxRzA%2BwN%2B25muztFm5TSPwE8HKJfWfR2NgfY%3D%0A&m=sf0cZEYYhbpkq15rNsD%2FeZyWnphZOJFkyfPz18wBmGg%3D%0A&s=95d3538cbfa66939e4cc9cfc1aaae8180aa1ac404e9ede7aeb8e46088d620014
>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list