[Mesa-dev] [PATCH 09/92] ddebug: handle some cases of non-TGSI shaders
Samuel Pitoiset
samuel.pitoiset at gmail.com
Tue Jun 27 08:38:46 UTC 2017
Don't you need to also update dd_unreference_copy_of_draw_state() and
dd_copy_draw_state() ?
On 06/26/2017 04:09 PM, Nicolai Hähnle wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> ---
> src/gallium/drivers/ddebug/dd_context.c | 6 ++++--
> src/gallium/drivers/ddebug/dd_draw.c | 9 +++++++--
> src/gallium/drivers/ddebug/dd_screen.c | 11 +++++++++++
> 3 files changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/drivers/ddebug/dd_context.c b/src/gallium/drivers/ddebug/dd_context.c
> index 1ace9e5..6b1ddc9 100644
> --- a/src/gallium/drivers/ddebug/dd_context.c
> +++ b/src/gallium/drivers/ddebug/dd_context.c
> @@ -307,37 +307,39 @@ DD_CSO_DELETE(vertex_elements)
> } \
> \
> static void \
> dd_context_delete_##name##_state(struct pipe_context *_pipe, void *state) \
> { \
> struct dd_context *dctx = dd_context(_pipe); \
> struct pipe_context *pipe = dctx->pipe; \
> struct dd_state *hstate = state; \
> \
> pipe->delete_##name##_state(pipe, hstate->cso); \
> - tgsi_free_tokens(hstate->state.shader.tokens); \
> + if (hstate->state.shader.type == PIPE_SHADER_IR_TGSI) \
> + tgsi_free_tokens(hstate->state.shader.tokens); \
> FREE(hstate); \
> }
>
> #define DD_SHADER(NAME, name) \
> static void * \
> dd_context_create_##name##_state(struct pipe_context *_pipe, \
> const struct pipe_shader_state *state) \
> { \
> struct pipe_context *pipe = dd_context(_pipe)->pipe; \
> struct dd_state *hstate = CALLOC_STRUCT(dd_state); \
> \
> if (!hstate) \
> return NULL; \
> hstate->cso = pipe->create_##name##_state(pipe, state); \
> hstate->state.shader = *state; \
> - hstate->state.shader.tokens = tgsi_dup_tokens(state->tokens); \
> + if (hstate->state.shader.type == PIPE_SHADER_IR_TGSI) \
> + hstate->state.shader.tokens = tgsi_dup_tokens(state->tokens); \
> return hstate; \
> } \
> \
> DD_SHADER_NOCREATE(NAME, name)
>
> DD_SHADER(FRAGMENT, fs)
> DD_SHADER(VERTEX, vs)
> DD_SHADER(GEOMETRY, gs)
> DD_SHADER(TESS_CTRL, tcs)
> DD_SHADER(TESS_EVAL, tes)
> diff --git a/src/gallium/drivers/ddebug/dd_draw.c b/src/gallium/drivers/ddebug/dd_draw.c
> index 7edf6af..c9d3a62 100644
> --- a/src/gallium/drivers/ddebug/dd_draw.c
> +++ b/src/gallium/drivers/ddebug/dd_draw.c
> @@ -91,22 +91,27 @@ dd_num_active_viewports(struct dd_draw_state *dstate)
>
> if (dstate->shaders[PIPE_SHADER_GEOMETRY])
> tokens = dstate->shaders[PIPE_SHADER_GEOMETRY]->state.shader.tokens;
> else if (dstate->shaders[PIPE_SHADER_TESS_EVAL])
> tokens = dstate->shaders[PIPE_SHADER_TESS_EVAL]->state.shader.tokens;
> else if (dstate->shaders[PIPE_SHADER_VERTEX])
> tokens = dstate->shaders[PIPE_SHADER_VERTEX]->state.shader.tokens;
> else
> return 1;
>
> - tgsi_scan_shader(tokens, &info);
> - return info.writes_viewport_index ? PIPE_MAX_VIEWPORTS : 1;
> + if (tokens) {
> + tgsi_scan_shader(tokens, &info);
> + if (info.writes_viewport_index)
> + return PIPE_MAX_VIEWPORTS;
> + }
> +
> + return 1;
> }
>
> #define COLOR_RESET "\033[0m"
> #define COLOR_SHADER "\033[1;32m"
> #define COLOR_STATE "\033[1;33m"
>
> #define DUMP(name, var) do { \
> fprintf(f, COLOR_STATE #name ": " COLOR_RESET); \
> util_dump_##name(f, var); \
> fprintf(f, "\n"); \
> diff --git a/src/gallium/drivers/ddebug/dd_screen.c b/src/gallium/drivers/ddebug/dd_screen.c
> index 9642532..a5d2be1 100644
> --- a/src/gallium/drivers/ddebug/dd_screen.c
> +++ b/src/gallium/drivers/ddebug/dd_screen.c
> @@ -48,20 +48,30 @@ dd_screen_get_vendor(struct pipe_screen *_screen)
> }
>
> static const char *
> dd_screen_get_device_vendor(struct pipe_screen *_screen)
> {
> struct pipe_screen *screen = dd_screen(_screen)->screen;
>
> return screen->get_device_vendor(screen);
> }
>
> +static const void *
> +dd_screen_get_compiler_options(struct pipe_screen *_screen,
> + enum pipe_shader_ir ir,
> + enum pipe_shader_type shader)
> +{
> + struct pipe_screen *screen = dd_screen(_screen)->screen;
> +
> + return screen->get_compiler_options(screen, ir, shader);
> +}
> +
> static struct disk_cache *
> dd_screen_get_disk_shader_cache(struct pipe_screen *_screen)
> {
> struct pipe_screen *screen = dd_screen(_screen)->screen;
>
> return screen->get_disk_shader_cache(screen);
> }
>
> static int
> dd_screen_get_param(struct pipe_screen *_screen,
> @@ -404,20 +414,21 @@ ddebug_screen_create(struct pipe_screen *screen)
> dscreen->base.resource_from_handle = dd_screen_resource_from_handle;
> SCR_INIT(resource_from_user_memory);
> dscreen->base.resource_get_handle = dd_screen_resource_get_handle;
> SCR_INIT(resource_changed);
> dscreen->base.resource_destroy = dd_screen_resource_destroy;
> SCR_INIT(flush_frontbuffer);
> SCR_INIT(fence_reference);
> SCR_INIT(fence_finish);
> SCR_INIT(get_driver_query_info);
> SCR_INIT(get_driver_query_group_info);
> + SCR_INIT(get_compiler_options);
>
> #undef SCR_INIT
>
> dscreen->screen = screen;
> dscreen->timeout_ms = timeout;
> dscreen->mode = mode;
> dscreen->no_flush = no_flush;
> dscreen->verbose = strstr(option, "verbose") != NULL;
> dscreen->apitrace_dump_call = apitrace_dump_call;
>
>
More information about the mesa-dev
mailing list