[Mesa-dev] [PATCH] nv50, nvc0: support sending string markers down into the command stream

Ilia Mirkin imirkin at alum.mit.edu
Sun Apr 3 21:59:01 UTC 2016


The functionality should be accessible today with KHR_debug (and
ARB_something, also in GL 4.3). I believe glretrace uses it, and
there's also an option to expose GREMEDY_string_marker. (If you do
ST_DEBUG=gremedy iirc.)

On Sun, Apr 3, 2016 at 5:53 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> I guess it's needed to override the gl version to use this feature as 4.3 is
> not yet supported?
>
> Anyway, this might be useful if apps use glDebugMessageInsert().
>
> Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>
>
> On 04/03/2016 10:04 PM, Ilia Mirkin wrote:
>>
>> This should hopefully make it a little easier to debug with GL
>> applications like glretrace and looking at command streams.
>>
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> ---
>>   src/gallium/drivers/nouveau/nv50/nv50_context.c | 25
>> +++++++++++++++++++++++++
>>   src/gallium/drivers/nouveau/nv50/nv50_screen.c  |  2 +-
>>   src/gallium/drivers/nouveau/nvc0/nvc0_context.c | 25
>> +++++++++++++++++++++++++
>>   src/gallium/drivers/nouveau/nvc0/nvc0_screen.c  |  2 +-
>>   4 files changed, 52 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_context.c
>> b/src/gallium/drivers/nouveau/nv50/nv50_context.c
>> index 61a52c4..5af0e9b 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_context.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_context.c
>> @@ -93,6 +93,30 @@ nv50_memory_barrier(struct pipe_context *pipe, unsigned
>> flags)
>>      }
>>   }
>>
>> +static void
>> +nv50_emit_string_marker(struct pipe_context *pipe, const char *str, int
>> len)
>> +{
>> +   struct nouveau_pushbuf *push = nv50_context(pipe)->base.pushbuf;
>> +   int string_words = len / 4;
>> +   int data_words;
>> +
>> +   if (len <= 0)
>> +      return;
>> +   string_words = MIN2(string_words, NV04_PFIFO_MAX_PACKET_LEN);
>> +   if (string_words == NV04_PFIFO_MAX_PACKET_LEN)
>> +      data_words = string_words;
>> +   else
>> +      data_words = string_words + !!(len & 3);
>> +   BEGIN_NI04(push, SUBC_3D(NV04_GRAPH_NOP), data_words);
>> +   if (string_words)
>> +      PUSH_DATAp(push, str, string_words);
>> +   if (string_words != data_words) {
>> +      int data = 0;
>> +      memcpy(&data, &str[string_words * 4], len & 3);
>> +      PUSH_DATA (push, data);
>> +   }
>> +}
>> +
>>   void
>>   nv50_default_kick_notify(struct nouveau_pushbuf *push)
>>   {
>> @@ -309,6 +333,7 @@ nv50_create(struct pipe_screen *pscreen, void *priv,
>> unsigned ctxflags)
>>      pipe->texture_barrier = nv50_texture_barrier;
>>      pipe->memory_barrier = nv50_memory_barrier;
>>      pipe->get_sample_position = nv50_context_get_sample_position;
>> +   pipe->emit_string_marker = nv50_emit_string_marker;
>>
>>      if (!screen->cur_ctx) {
>>         /* Restore the last context's state here, normally handled during
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> index 44167e1..6065394 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> @@ -194,6 +194,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen,
>> enum pipe_cap param)
>>      case PIPE_CAP_COMPUTE:
>>      case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
>>      case PIPE_CAP_INVALIDATE_BUFFER:
>> +   case PIPE_CAP_STRING_MARKER:
>>         return 1;
>>      case PIPE_CAP_SEAMLESS_CUBE_MAP:
>>         return 1; /* class_3d >= NVA0_3D_CLASS; */
>> @@ -236,7 +237,6 @@ nv50_screen_get_param(struct pipe_screen *pscreen,
>> enum pipe_cap param)
>>      case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
>>      case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
>>      case PIPE_CAP_GENERATE_MIPMAP:
>> -   case PIPE_CAP_STRING_MARKER:
>>      case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
>>      case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
>>      case PIPE_CAP_QUERY_BUFFER_OBJECT:
>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c
>> b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c
>> index 007cccf..fcb8289 100644
>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c
>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c
>> @@ -97,6 +97,30 @@ nvc0_memory_barrier(struct pipe_context *pipe, unsigned
>> flags)
>>   }
>>
>>   static void
>> +nvc0_emit_string_marker(struct pipe_context *pipe, const char *str, int
>> len)
>> +{
>> +   struct nouveau_pushbuf *push = nvc0_context(pipe)->base.pushbuf;
>> +   int string_words = len / 4;
>> +   int data_words;
>> +
>> +   if (len <= 0)
>> +      return;
>> +   string_words = MIN2(string_words, NV04_PFIFO_MAX_PACKET_LEN);
>> +   if (string_words == NV04_PFIFO_MAX_PACKET_LEN)
>> +      data_words = string_words;
>> +   else
>> +      data_words = string_words + !!(len & 3);
>> +   BEGIN_NIC0(push, SUBC_3D(NV04_GRAPH_NOP), data_words);
>> +   if (string_words)
>> +      PUSH_DATAp(push, str, string_words);
>> +   if (string_words != data_words) {
>> +      int data = 0;
>> +      memcpy(&data, &str[string_words * 4], len & 3);
>> +      PUSH_DATA (push, data);
>> +   }
>> +}
>> +
>> +static void
>>   nvc0_context_unreference_resources(struct nvc0_context *nvc0)
>>   {
>>      unsigned s, i;
>> @@ -333,6 +357,7 @@ nvc0_create(struct pipe_screen *pscreen, void *priv,
>> unsigned ctxflags)
>>      pipe->texture_barrier = nvc0_texture_barrier;
>>      pipe->memory_barrier = nvc0_memory_barrier;
>>      pipe->get_sample_position = nvc0_context_get_sample_position;
>> +   pipe->emit_string_marker = nvc0_emit_string_marker;
>>
>>      nouveau_context_init(&nvc0->base);
>>      nvc0_init_query_functions(nvc0);
>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> index b4bb27b..35f465b 100644
>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> @@ -215,6 +215,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen,
>> enum pipe_cap param)
>>      case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
>>      case PIPE_CAP_QUERY_BUFFER_OBJECT:
>>      case PIPE_CAP_INVALIDATE_BUFFER:
>> +   case PIPE_CAP_STRING_MARKER:
>>         return 1;
>>      case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
>>         return (class_3d >= NVE4_3D_CLASS) ? 1 : 0;
>> @@ -241,7 +242,6 @@ nvc0_screen_get_param(struct pipe_screen *pscreen,
>> enum pipe_cap param)
>>      case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>>      case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
>>      case PIPE_CAP_GENERATE_MIPMAP:
>> -   case PIPE_CAP_STRING_MARKER:
>>      case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
>>      case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
>>      case PIPE_CAP_QUERY_MEMORY_INFO:
>>
>


More information about the mesa-dev mailing list