1525921ed51176255474c73adacfc6801a7bf2783Marek Olšák/**************************************************************************
2525921ed51176255474c73adacfc6801a7bf2783Marek Olšák *
3525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * Copyright 2015 Advanced Micro Devices, Inc.
4525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * Copyright 2008 VMware, Inc.
5525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * All Rights Reserved.
6525921ed51176255474c73adacfc6801a7bf2783Marek Olšák *
7525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining a
8525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * copy of this software and associated documentation files (the "Software"),
9525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * to deal in the Software without restriction, including without limitation
10525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * on the rights to use, copy, modify, merge, publish, distribute, sub
11525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * license, and/or sell copies of the Software, and to permit persons to whom
12525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * the Software is furnished to do so, subject to the following conditions:
13525921ed51176255474c73adacfc6801a7bf2783Marek Olšák *
14525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * The above copyright notice and this permission notice (including the next
15525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * paragraph) shall be included in all copies or substantial portions of the
16525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * Software.
17525921ed51176255474c73adacfc6801a7bf2783Marek Olšák *
18525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24525921ed51176255474c73adacfc6801a7bf2783Marek Olšák * USE OR OTHER DEALINGS IN THE SOFTWARE.
25525921ed51176255474c73adacfc6801a7bf2783Marek Olšák *
26525921ed51176255474c73adacfc6801a7bf2783Marek Olšák **************************************************************************/
27525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
28525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#include "dd_pipe.h"
29525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
30525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#include "util/u_dump.h"
31525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#include "util/u_format.h"
32b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák#include "util/u_framebuffer.h"
33b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák#include "util/u_helpers.h"
34b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák#include "util/u_inlines.h"
35b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák#include "util/u_memory.h"
36b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák#include "tgsi/tgsi_parse.h"
37525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#include "tgsi/tgsi_scan.h"
38b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák#include "os/os_time.h"
39b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák#include <inttypes.h>
40525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
41525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
42525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic FILE *
4326ef8158ac3c076cba0c1bcc4b42fdf233562cf9Marek Olšákdd_get_file_stream(struct dd_screen *dscreen, unsigned apitrace_call_number)
44525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
4526ef8158ac3c076cba0c1bcc4b42fdf233562cf9Marek Olšák   struct pipe_screen *screen = dscreen->screen;
466573ad69ef836118c006acd7ccd3506e5c023b6eMarek Olšák   char cmd_line[4096];
476573ad69ef836118c006acd7ccd3506e5c023b6eMarek Olšák
4841875ac4edd8c884225c44c0840bd20291b410caNicolai Hähnle   FILE *f = dd_get_debug_file(dscreen->verbose);
4989f73827d03e28af548cc11247ebd6e2825789afMarek Olšák   if (!f)
50525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      return NULL;
51525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
526573ad69ef836118c006acd7ccd3506e5c023b6eMarek Olšák   if (os_get_command_line(cmd_line, sizeof(cmd_line)))
536573ad69ef836118c006acd7ccd3506e5c023b6eMarek Olšák      fprintf(f, "Command: %s\n", cmd_line);
54525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "Driver vendor: %s\n", screen->get_vendor(screen));
55525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "Device vendor: %s\n", screen->get_device_vendor(screen));
56525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "Device name: %s\n\n", screen->get_name(screen));
5750b223547814cefc0e7130e199fabc4dbedf97ceMarek Olšák
5826ef8158ac3c076cba0c1bcc4b42fdf233562cf9Marek Olšák   if (apitrace_call_number)
5950b223547814cefc0e7130e199fabc4dbedf97ceMarek Olšák      fprintf(f, "Last apitrace call: %u\n\n",
6026ef8158ac3c076cba0c1bcc4b42fdf233562cf9Marek Olšák              apitrace_call_number);
61525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   return f;
62525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
63525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
64525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
65f7720948cca971606c90b96c67128b93737af09dMarek Olšákdd_dump_dmesg(FILE *f)
66f7720948cca971606c90b96c67128b93737af09dMarek Olšák{
67f7720948cca971606c90b96c67128b93737af09dMarek Olšák   char line[2000];
68f7720948cca971606c90b96c67128b93737af09dMarek Olšák   FILE *p = popen("dmesg | tail -n60", "r");
69f7720948cca971606c90b96c67128b93737af09dMarek Olšák
70f7720948cca971606c90b96c67128b93737af09dMarek Olšák   if (!p)
71f7720948cca971606c90b96c67128b93737af09dMarek Olšák      return;
72f7720948cca971606c90b96c67128b93737af09dMarek Olšák
73f7720948cca971606c90b96c67128b93737af09dMarek Olšák   fprintf(f, "\nLast 60 lines of dmesg:\n\n");
74f7720948cca971606c90b96c67128b93737af09dMarek Olšák   while (fgets(line, sizeof(line), p))
75f7720948cca971606c90b96c67128b93737af09dMarek Olšák      fputs(line, f);
76f7720948cca971606c90b96c67128b93737af09dMarek Olšák
77bade0cd0fbbf8004626e485806973d18f493749aNicolai Hähnle   pclose(p);
78f7720948cca971606c90b96c67128b93737af09dMarek Olšák}
79f7720948cca971606c90b96c67128b93737af09dMarek Olšák
80f7720948cca971606c90b96c67128b93737af09dMarek Olšákstatic void
81525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_close_file_stream(FILE *f)
82525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
83525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fclose(f);
84525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
85525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
86525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic unsigned
8795c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_num_active_viewports(struct dd_draw_state *dstate)
88525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
89525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct tgsi_shader_info info;
90525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   const struct tgsi_token *tokens;
91525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
9295c3025a4163128584900b8f377d299c8e707d17Marek Olšák   if (dstate->shaders[PIPE_SHADER_GEOMETRY])
9395c3025a4163128584900b8f377d299c8e707d17Marek Olšák      tokens = dstate->shaders[PIPE_SHADER_GEOMETRY]->state.shader.tokens;
9495c3025a4163128584900b8f377d299c8e707d17Marek Olšák   else if (dstate->shaders[PIPE_SHADER_TESS_EVAL])
9595c3025a4163128584900b8f377d299c8e707d17Marek Olšák      tokens = dstate->shaders[PIPE_SHADER_TESS_EVAL]->state.shader.tokens;
9695c3025a4163128584900b8f377d299c8e707d17Marek Olšák   else if (dstate->shaders[PIPE_SHADER_VERTEX])
9795c3025a4163128584900b8f377d299c8e707d17Marek Olšák      tokens = dstate->shaders[PIPE_SHADER_VERTEX]->state.shader.tokens;
98525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   else
99525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      return 1;
100525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
101525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   tgsi_scan_shader(tokens, &info);
102525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   return info.writes_viewport_index ? PIPE_MAX_VIEWPORTS : 1;
103525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
104525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
105525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#define COLOR_RESET	"\033[0m"
106525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#define COLOR_SHADER	"\033[1;32m"
107525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#define COLOR_STATE	"\033[1;33m"
108525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
109525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#define DUMP(name, var) do { \
110525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, COLOR_STATE #name ": " COLOR_RESET); \
111525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   util_dump_##name(f, var); \
112525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "\n"); \
113525921ed51176255474c73adacfc6801a7bf2783Marek Olšák} while(0)
114525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
115525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#define DUMP_I(name, var, i) do { \
116525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, COLOR_STATE #name " %i: " COLOR_RESET, i); \
117525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   util_dump_##name(f, var); \
118525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "\n"); \
119525921ed51176255474c73adacfc6801a7bf2783Marek Olšák} while(0)
120525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
121525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#define DUMP_M(name, var, member) do { \
122525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "  " #member ": "); \
123525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   util_dump_##name(f, (var)->member); \
124525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "\n"); \
125525921ed51176255474c73adacfc6801a7bf2783Marek Olšák} while(0)
126525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
127525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#define DUMP_M_ADDR(name, var, member) do { \
128525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "  " #member ": "); \
129525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   util_dump_##name(f, &(var)->member); \
130525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "\n"); \
131525921ed51176255474c73adacfc6801a7bf2783Marek Olšák} while(0)
132525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
133525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
134525921ed51176255474c73adacfc6801a7bf2783Marek Olšákprint_named_value(FILE *f, const char *name, int value)
135525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
136525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, COLOR_STATE "%s" COLOR_RESET " = %i\n", name, value);
137525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
138525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
139525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
140525921ed51176255474c73adacfc6801a7bf2783Marek Olšákprint_named_xvalue(FILE *f, const char *name, int value)
141525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
142525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, COLOR_STATE "%s" COLOR_RESET " = 0x%08x\n", name, value);
143525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
144525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
145525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
146525921ed51176255474c73adacfc6801a7bf2783Marek Olšákutil_dump_uint(FILE *f, unsigned i)
147525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
148525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%u", i);
149525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
150525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
151525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
152525921ed51176255474c73adacfc6801a7bf2783Marek Olšákutil_dump_hex(FILE *f, unsigned i)
153525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
154525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "0x%x", i);
155525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
156525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
157525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
158525921ed51176255474c73adacfc6801a7bf2783Marek Olšákutil_dump_double(FILE *f, double d)
159525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
160525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%f", d);
161525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
162525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
163525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
164525921ed51176255474c73adacfc6801a7bf2783Marek Olšákutil_dump_format(FILE *f, enum pipe_format format)
165525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
166525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%s", util_format_name(format));
167525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
168525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
169525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
170525921ed51176255474c73adacfc6801a7bf2783Marek Olšákutil_dump_color_union(FILE *f, const union pipe_color_union *color)
171525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
172525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "{f = {%f, %f, %f, %f}, ui = {%u, %u, %u, %u}",
173525921ed51176255474c73adacfc6801a7bf2783Marek Olšák           color->f[0], color->f[1], color->f[2], color->f[3],
174525921ed51176255474c73adacfc6801a7bf2783Marek Olšák           color->ui[0], color->ui[1], color->ui[2], color->ui[3]);
175525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
176525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
177525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
178525921ed51176255474c73adacfc6801a7bf2783Marek Olšákutil_dump_query(FILE *f, struct dd_query *query)
179525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
180525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (query->type >= PIPE_QUERY_DRIVER_SPECIFIC)
181525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(f, "PIPE_QUERY_DRIVER_SPECIFIC + %i",
182525921ed51176255474c73adacfc6801a7bf2783Marek Olšák              query->type - PIPE_QUERY_DRIVER_SPECIFIC);
183525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   else
184525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(f, "%s", util_dump_query_type(query->type, false));
185525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
186525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
187525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
18895c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_render_condition(struct dd_draw_state *dstate, FILE *f)
189525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
19095c3025a4163128584900b8f377d299c8e707d17Marek Olšák   if (dstate->render_cond.query) {
191525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(f, "render condition:\n");
19295c3025a4163128584900b8f377d299c8e707d17Marek Olšák      DUMP_M(query, &dstate->render_cond, query);
19395c3025a4163128584900b8f377d299c8e707d17Marek Olšák      DUMP_M(uint, &dstate->render_cond, condition);
19495c3025a4163128584900b8f377d299c8e707d17Marek Olšák      DUMP_M(uint, &dstate->render_cond, mode);
195525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(f, "\n");
196525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
197525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
198525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
199525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
20095c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_draw_vbo(struct dd_draw_state *dstate, struct pipe_draw_info *info, FILE *f)
201525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
202525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   int sh, i;
203525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   const char *shader_str[PIPE_SHADER_TYPES];
204525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
205525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   shader_str[PIPE_SHADER_VERTEX] = "VERTEX";
206525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   shader_str[PIPE_SHADER_TESS_CTRL] = "TESS_CTRL";
207525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   shader_str[PIPE_SHADER_TESS_EVAL] = "TESS_EVAL";
208525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   shader_str[PIPE_SHADER_GEOMETRY] = "GEOMETRY";
209525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   shader_str[PIPE_SHADER_FRAGMENT] = "FRAGMENT";
210525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   shader_str[PIPE_SHADER_COMPUTE] = "COMPUTE";
211525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
212525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP(draw_info, info);
213525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (info->indexed) {
21495c3025a4163128584900b8f377d299c8e707d17Marek Olšák      DUMP(index_buffer, &dstate->index_buffer);
21595c3025a4163128584900b8f377d299c8e707d17Marek Olšák      if (dstate->index_buffer.buffer)
21695c3025a4163128584900b8f377d299c8e707d17Marek Olšák         DUMP_M(resource, &dstate->index_buffer, buffer);
217525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
218525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (info->count_from_stream_output)
219525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      DUMP_M(stream_output_target, info,
220525921ed51176255474c73adacfc6801a7bf2783Marek Olšák             count_from_stream_output);
221525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (info->indirect)
222525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      DUMP_M(resource, info, indirect);
223525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "\n");
224525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
225525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   /* TODO: dump active queries */
226525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
22795c3025a4163128584900b8f377d299c8e707d17Marek Olšák   dd_dump_render_condition(dstate, f);
228525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
229525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   for (i = 0; i < PIPE_MAX_ATTRIBS; i++)
23095c3025a4163128584900b8f377d299c8e707d17Marek Olšák      if (dstate->vertex_buffers[i].buffer ||
23195c3025a4163128584900b8f377d299c8e707d17Marek Olšák          dstate->vertex_buffers[i].user_buffer) {
23295c3025a4163128584900b8f377d299c8e707d17Marek Olšák         DUMP_I(vertex_buffer, &dstate->vertex_buffers[i], i);
23395c3025a4163128584900b8f377d299c8e707d17Marek Olšák         if (dstate->vertex_buffers[i].buffer)
23495c3025a4163128584900b8f377d299c8e707d17Marek Olšák            DUMP_M(resource, &dstate->vertex_buffers[i], buffer);
235525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      }
236525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
23795c3025a4163128584900b8f377d299c8e707d17Marek Olšák   if (dstate->velems) {
238525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      print_named_value(f, "num vertex elements",
23995c3025a4163128584900b8f377d299c8e707d17Marek Olšák                        dstate->velems->state.velems.count);
24095c3025a4163128584900b8f377d299c8e707d17Marek Olšák      for (i = 0; i < dstate->velems->state.velems.count; i++) {
241525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         fprintf(f, "  ");
24295c3025a4163128584900b8f377d299c8e707d17Marek Olšák         DUMP_I(vertex_element, &dstate->velems->state.velems.velems[i], i);
243525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      }
244525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
245525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
24695c3025a4163128584900b8f377d299c8e707d17Marek Olšák   print_named_value(f, "num stream output targets", dstate->num_so_targets);
24795c3025a4163128584900b8f377d299c8e707d17Marek Olšák   for (i = 0; i < dstate->num_so_targets; i++)
24895c3025a4163128584900b8f377d299c8e707d17Marek Olšák      if (dstate->so_targets[i]) {
24995c3025a4163128584900b8f377d299c8e707d17Marek Olšák         DUMP_I(stream_output_target, dstate->so_targets[i], i);
25095c3025a4163128584900b8f377d299c8e707d17Marek Olšák         DUMP_M(resource, dstate->so_targets[i], buffer);
25195c3025a4163128584900b8f377d299c8e707d17Marek Olšák         fprintf(f, "  offset = %i\n", dstate->so_offsets[i]);
252525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      }
253525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
254525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "\n");
255525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) {
256525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      if (sh == PIPE_SHADER_COMPUTE)
257525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         continue;
258525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
259525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      if (sh == PIPE_SHADER_TESS_CTRL &&
26095c3025a4163128584900b8f377d299c8e707d17Marek Olšák          !dstate->shaders[PIPE_SHADER_TESS_CTRL] &&
26195c3025a4163128584900b8f377d299c8e707d17Marek Olšák          dstate->shaders[PIPE_SHADER_TESS_EVAL])
262525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         fprintf(f, "tess_state: {default_outer_level = {%f, %f, %f, %f}, "
263525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                 "default_inner_level = {%f, %f}}\n",
26495c3025a4163128584900b8f377d299c8e707d17Marek Olšák                 dstate->tess_default_levels[0],
26595c3025a4163128584900b8f377d299c8e707d17Marek Olšák                 dstate->tess_default_levels[1],
26695c3025a4163128584900b8f377d299c8e707d17Marek Olšák                 dstate->tess_default_levels[2],
26795c3025a4163128584900b8f377d299c8e707d17Marek Olšák                 dstate->tess_default_levels[3],
26895c3025a4163128584900b8f377d299c8e707d17Marek Olšák                 dstate->tess_default_levels[4],
26995c3025a4163128584900b8f377d299c8e707d17Marek Olšák                 dstate->tess_default_levels[5]);
270525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
271525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      if (sh == PIPE_SHADER_FRAGMENT)
27295c3025a4163128584900b8f377d299c8e707d17Marek Olšák         if (dstate->rs) {
27395c3025a4163128584900b8f377d299c8e707d17Marek Olšák            unsigned num_viewports = dd_num_active_viewports(dstate);
274525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
27595c3025a4163128584900b8f377d299c8e707d17Marek Olšák            if (dstate->rs->state.rs.clip_plane_enable)
27695c3025a4163128584900b8f377d299c8e707d17Marek Olšák               DUMP(clip_state, &dstate->clip_state);
277525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
278525921ed51176255474c73adacfc6801a7bf2783Marek Olšák            for (i = 0; i < num_viewports; i++)
27995c3025a4163128584900b8f377d299c8e707d17Marek Olšák               DUMP_I(viewport_state, &dstate->viewports[i], i);
280525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
28195c3025a4163128584900b8f377d299c8e707d17Marek Olšák            if (dstate->rs->state.rs.scissor)
282525921ed51176255474c73adacfc6801a7bf2783Marek Olšák               for (i = 0; i < num_viewports; i++)
28395c3025a4163128584900b8f377d299c8e707d17Marek Olšák                  DUMP_I(scissor_state, &dstate->scissors[i], i);
284525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
28595c3025a4163128584900b8f377d299c8e707d17Marek Olšák            DUMP(rasterizer_state, &dstate->rs->state.rs);
286525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
28795c3025a4163128584900b8f377d299c8e707d17Marek Olšák            if (dstate->rs->state.rs.poly_stipple_enable)
28895c3025a4163128584900b8f377d299c8e707d17Marek Olšák               DUMP(poly_stipple, &dstate->polygon_stipple);
289525921ed51176255474c73adacfc6801a7bf2783Marek Olšák            fprintf(f, "\n");
290525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         }
291525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
29295c3025a4163128584900b8f377d299c8e707d17Marek Olšák      if (!dstate->shaders[sh])
293525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         continue;
294525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
295525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(f, COLOR_SHADER "begin shader: %s" COLOR_RESET "\n", shader_str[sh]);
29695c3025a4163128584900b8f377d299c8e707d17Marek Olšák      DUMP(shader_state, &dstate->shaders[sh]->state.shader);
297525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
298525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; i++)
29995c3025a4163128584900b8f377d299c8e707d17Marek Olšák         if (dstate->constant_buffers[sh][i].buffer ||
30095c3025a4163128584900b8f377d299c8e707d17Marek Olšák             dstate->constant_buffers[sh][i].user_buffer) {
30195c3025a4163128584900b8f377d299c8e707d17Marek Olšák            DUMP_I(constant_buffer, &dstate->constant_buffers[sh][i], i);
30295c3025a4163128584900b8f377d299c8e707d17Marek Olšák            if (dstate->constant_buffers[sh][i].buffer)
30395c3025a4163128584900b8f377d299c8e707d17Marek Olšák               DUMP_M(resource, &dstate->constant_buffers[sh][i], buffer);
304525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         }
305525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
306525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      for (i = 0; i < PIPE_MAX_SAMPLERS; i++)
30795c3025a4163128584900b8f377d299c8e707d17Marek Olšák         if (dstate->sampler_states[sh][i])
30895c3025a4163128584900b8f377d299c8e707d17Marek Olšák            DUMP_I(sampler_state, &dstate->sampler_states[sh][i]->state.sampler, i);
309525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
310525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      for (i = 0; i < PIPE_MAX_SAMPLERS; i++)
31195c3025a4163128584900b8f377d299c8e707d17Marek Olšák         if (dstate->sampler_views[sh][i]) {
31295c3025a4163128584900b8f377d299c8e707d17Marek Olšák            DUMP_I(sampler_view, dstate->sampler_views[sh][i], i);
31395c3025a4163128584900b8f377d299c8e707d17Marek Olšák            DUMP_M(resource, dstate->sampler_views[sh][i], texture);
314525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         }
315525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
316c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák      for (i = 0; i < PIPE_MAX_SHADER_IMAGES; i++)
317c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák         if (dstate->shader_images[sh][i].resource) {
318c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák            DUMP_I(image_view, &dstate->shader_images[sh][i], i);
319c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák            if (dstate->shader_images[sh][i].resource)
320c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák               DUMP_M(resource, &dstate->shader_images[sh][i], resource);
321c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák         }
322c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák
323c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák      for (i = 0; i < PIPE_MAX_SHADER_BUFFERS; i++)
324c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák         if (dstate->shader_buffers[sh][i].buffer) {
325c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák            DUMP_I(shader_buffer, &dstate->shader_buffers[sh][i], i);
326c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák            if (dstate->shader_buffers[sh][i].buffer)
327c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák               DUMP_M(resource, &dstate->shader_buffers[sh][i], buffer);
328c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák         }
329525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
330525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(f, COLOR_SHADER "end shader: %s" COLOR_RESET "\n\n", shader_str[sh]);
331525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
332525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
33395c3025a4163128584900b8f377d299c8e707d17Marek Olšák   if (dstate->dsa)
33495c3025a4163128584900b8f377d299c8e707d17Marek Olšák      DUMP(depth_stencil_alpha_state, &dstate->dsa->state.dsa);
33595c3025a4163128584900b8f377d299c8e707d17Marek Olšák   DUMP(stencil_ref, &dstate->stencil_ref);
336525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
33795c3025a4163128584900b8f377d299c8e707d17Marek Olšák   if (dstate->blend)
33895c3025a4163128584900b8f377d299c8e707d17Marek Olšák      DUMP(blend_state, &dstate->blend->state.blend);
33995c3025a4163128584900b8f377d299c8e707d17Marek Olšák   DUMP(blend_color, &dstate->blend_color);
340525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
34195c3025a4163128584900b8f377d299c8e707d17Marek Olšák   print_named_value(f, "min_samples", dstate->min_samples);
34295c3025a4163128584900b8f377d299c8e707d17Marek Olšák   print_named_xvalue(f, "sample_mask", dstate->sample_mask);
343525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "\n");
344525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
34595c3025a4163128584900b8f377d299c8e707d17Marek Olšák   DUMP(framebuffer_state, &dstate->framebuffer_state);
34695c3025a4163128584900b8f377d299c8e707d17Marek Olšák   for (i = 0; i < dstate->framebuffer_state.nr_cbufs; i++)
34795c3025a4163128584900b8f377d299c8e707d17Marek Olšák      if (dstate->framebuffer_state.cbufs[i]) {
348525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         fprintf(f, "  " COLOR_STATE "cbufs[%i]:" COLOR_RESET "\n    ", i);
34995c3025a4163128584900b8f377d299c8e707d17Marek Olšák         DUMP(surface, dstate->framebuffer_state.cbufs[i]);
350525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         fprintf(f, "    ");
35195c3025a4163128584900b8f377d299c8e707d17Marek Olšák         DUMP(resource, dstate->framebuffer_state.cbufs[i]->texture);
352525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      }
35395c3025a4163128584900b8f377d299c8e707d17Marek Olšák   if (dstate->framebuffer_state.zsbuf) {
354525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(f, "  " COLOR_STATE "zsbuf:" COLOR_RESET "\n    ");
35595c3025a4163128584900b8f377d299c8e707d17Marek Olšák      DUMP(surface, dstate->framebuffer_state.zsbuf);
356525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(f, "    ");
35795c3025a4163128584900b8f377d299c8e707d17Marek Olšák      DUMP(resource, dstate->framebuffer_state.zsbuf->texture);
358525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
359525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "\n");
360525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
361525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
362525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
36395c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_launch_grid(struct dd_draw_state *dstate, struct pipe_grid_info *info, FILE *f)
364ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen{
365ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   fprintf(f, "%s:\n", __func__+8);
366ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   /* TODO */
367ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen}
368ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen
369ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizenstatic void
37095c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_resource_copy_region(struct dd_draw_state *dstate,
371525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                             struct call_resource_copy_region *info,
372525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                             FILE *f)
373525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
374525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%s:\n", __func__+8);
375525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(resource, info, dst);
376525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, dst_level);
377525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, dstx);
378525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, dsty);
379525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, dstz);
380525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(resource, info, src);
381525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, src_level);
3820795a3d54f7748d27020851f2e9b4b7637597590Marek Olšák   DUMP_M_ADDR(box, info, src_box);
383525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
384525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
385525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
38695c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_blit(struct dd_draw_state *dstate, struct pipe_blit_info *info, FILE *f)
387525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
388525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%s:\n", __func__+8);
389525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(resource, info, dst.resource);
390525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, dst.level);
391525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M_ADDR(box, info, dst.box);
392525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(format, info, dst.format);
393525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
394525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(resource, info, src.resource);
395525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, src.level);
396525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M_ADDR(box, info, src.box);
397525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(format, info, src.format);
398525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
399525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(hex, info, mask);
400525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, filter);
401525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, scissor_enable);
402525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M_ADDR(scissor_state, info, scissor);
403525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, render_condition_enable);
404525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
405525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (info->render_condition_enable)
40695c3025a4163128584900b8f377d299c8e707d17Marek Olšák      dd_dump_render_condition(dstate, f);
407525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
408525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
409525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
41095c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_generate_mipmap(struct dd_draw_state *dstate, FILE *f)
4111daec2b795a2c029b89202a15142376ac701bc39Marek Olšák{
4121daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   fprintf(f, "%s:\n", __func__+8);
4131daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   /* TODO */
4141daec2b795a2c029b89202a15142376ac701bc39Marek Olšák}
4151daec2b795a2c029b89202a15142376ac701bc39Marek Olšák
4161daec2b795a2c029b89202a15142376ac701bc39Marek Olšákstatic void
41795c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_flush_resource(struct dd_draw_state *dstate, struct pipe_resource *res,
418525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                       FILE *f)
419525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
420525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%s:\n", __func__+8);
421525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP(resource, res);
422525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
423525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
424525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
42595c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_clear(struct dd_draw_state *dstate, struct call_clear *info, FILE *f)
426525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
427525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%s:\n", __func__+8);
428525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, buffers);
4290795a3d54f7748d27020851f2e9b4b7637597590Marek Olšák   DUMP_M_ADDR(color_union, info, color);
430525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(double, info, depth);
431525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(hex, info, stencil);
432525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
433525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
434525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
43595c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_clear_buffer(struct dd_draw_state *dstate, struct call_clear_buffer *info,
436525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                     FILE *f)
437525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
438525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   int i;
439525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   const char *value = (const char*)info->clear_value;
440525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
441525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%s:\n", __func__+8);
442525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(resource, info, res);
443525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, offset);
444525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, size);
445525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DUMP_M(uint, info, clear_value_size);
446525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
447525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "  clear_value:");
448525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   for (i = 0; i < info->clear_value_size; i++)
449525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(f, " %02x", value[i]);
450525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "\n");
451525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
452525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
453525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
45495c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_clear_render_target(struct dd_draw_state *dstate, FILE *f)
455525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
456525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%s:\n", __func__+8);
457525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   /* TODO */
458525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
459525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
460525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
46195c3025a4163128584900b8f377d299c8e707d17Marek Olšákdd_dump_clear_depth_stencil(struct dd_draw_state *dstate, FILE *f)
462525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
463525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(f, "%s:\n", __func__+8);
464525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   /* TODO */
465525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
466525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
467525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
468525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_dump_driver_state(struct dd_context *dctx, FILE *f, unsigned flags)
469525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
470525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (dctx->pipe->dump_debug_state) {
471525921ed51176255474c73adacfc6801a7bf2783Marek Olšák	   fprintf(f,"\n\n**************************************************"
472525921ed51176255474c73adacfc6801a7bf2783Marek Olšák		     "***************************\n");
473525921ed51176255474c73adacfc6801a7bf2783Marek Olšák	   fprintf(f, "Driver-specific state:\n\n");
474525921ed51176255474c73adacfc6801a7bf2783Marek Olšák	   dctx->pipe->dump_debug_state(dctx->pipe, f, flags);
475525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
476525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
477525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
478525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
479d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšákdd_dump_call(FILE *f, struct dd_draw_state *state, struct dd_call *call)
480525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
481525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   switch (call->type) {
482525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case CALL_DRAW_VBO:
483d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_draw_vbo(state, &call->info.draw_vbo, f);
484525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      break;
485ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   case CALL_LAUNCH_GRID:
486d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_launch_grid(state, &call->info.launch_grid, f);
487ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen      break;
488525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case CALL_RESOURCE_COPY_REGION:
489d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_resource_copy_region(state,
49095c3025a4163128584900b8f377d299c8e707d17Marek Olšák                                   &call->info.resource_copy_region, f);
491525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      break;
492525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case CALL_BLIT:
493d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_blit(state, &call->info.blit, f);
494525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      break;
495525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case CALL_FLUSH_RESOURCE:
496d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_flush_resource(state, call->info.flush_resource, f);
497525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      break;
498525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case CALL_CLEAR:
499d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_clear(state, &call->info.clear, f);
500525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      break;
501525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case CALL_CLEAR_BUFFER:
502d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_clear_buffer(state, &call->info.clear_buffer, f);
503525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      break;
504525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case CALL_CLEAR_RENDER_TARGET:
505d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_clear_render_target(state, f);
506525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      break;
507525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case CALL_CLEAR_DEPTH_STENCIL:
508d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_clear_depth_stencil(state, f);
5091daec2b795a2c029b89202a15142376ac701bc39Marek Olšák      break;
5101daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   case CALL_GENERATE_MIPMAP:
511d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      dd_dump_generate_mipmap(state, f);
5121daec2b795a2c029b89202a15142376ac701bc39Marek Olšák      break;
513525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
514d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák}
515d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák
516d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšákstatic void
517d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšákdd_write_report(struct dd_context *dctx, struct dd_call *call, unsigned flags,
518d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák                bool dump_dmesg)
519d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák{
520d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák   FILE *f = dd_get_file_stream(dd_screen(dctx->base.screen),
521d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák                                dctx->draw_state.apitrace_call_number);
522d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák
523d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák   if (!f)
524d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák      return;
525525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
526d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák   dd_dump_call(f, &dctx->draw_state, call);
527525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_dump_driver_state(dctx, f, flags);
528f7720948cca971606c90b96c67128b93737af09dMarek Olšák   if (dump_dmesg)
529f7720948cca971606c90b96c67128b93737af09dMarek Olšák      dd_dump_dmesg(f);
530525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_close_file_stream(f);
531525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
532525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
533525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
534525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_kill_process(void)
535525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
536525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   sync();
537525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fprintf(stderr, "dd: Aborting the process...\n");
538525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fflush(stdout);
539525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   fflush(stderr);
5406b9924ccb67ad04ef8f3020dd08a5b47d4ec06e2Marek Olšák   exit(1);
541525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
542525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
543525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic bool
544525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_flush_and_check_hang(struct dd_context *dctx,
545525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                        struct pipe_fence_handle **flush_fence,
546525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                        unsigned flush_flags)
547525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
548525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_fence_handle *fence = NULL;
549525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
550525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_screen *screen = pipe->screen;
551525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   uint64_t timeout_ms = dd_screen(dctx->base.screen)->timeout_ms;
552525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   bool idle;
553525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
554525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   assert(timeout_ms > 0);
555525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
556525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   pipe->flush(pipe, &fence, flush_flags);
557525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (flush_fence)
558525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      screen->fence_reference(screen, flush_fence, fence);
559525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (!fence)
560525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      return false;
561525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
5629e1dc104329562eb8a3e4a20f0320af20b9af589Marek Olšák   idle = screen->fence_finish(screen, pipe, fence, timeout_ms * 1000000);
563525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   screen->fence_reference(screen, &fence, NULL);
564525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (!idle)
565525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      fprintf(stderr, "dd: GPU hang detected!\n");
566525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   return !idle;
567525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
568525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
569525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
570525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_flush_and_handle_hang(struct dd_context *dctx,
571525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                         struct pipe_fence_handle **fence, unsigned flags,
572525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                         const char *cause)
573525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
574525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   if (dd_flush_and_check_hang(dctx, fence, flags)) {
57526ef8158ac3c076cba0c1bcc4b42fdf233562cf9Marek Olšák      FILE *f = dd_get_file_stream(dd_screen(dctx->base.screen),
57695c3025a4163128584900b8f377d299c8e707d17Marek Olšák                                   dctx->draw_state.apitrace_call_number);
577525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
578525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      if (f) {
579525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         fprintf(f, "dd: %s.\n", cause);
5806bf81de339289b0d005553414ce568b136a0ca5fMarek Olšák         dd_dump_driver_state(dctx, f,
5816bf81de339289b0d005553414ce568b136a0ca5fMarek Olšák                              PIPE_DUMP_DEVICE_STATUS_REGISTERS |
5826bf81de339289b0d005553414ce568b136a0ca5fMarek Olšák                              PIPE_DUMP_CURRENT_STATES |
5836bf81de339289b0d005553414ce568b136a0ca5fMarek Olšák                              PIPE_DUMP_CURRENT_SHADERS |
5846bf81de339289b0d005553414ce568b136a0ca5fMarek Olšák                              PIPE_DUMP_LAST_COMMAND_BUFFER);
585f7720948cca971606c90b96c67128b93737af09dMarek Olšák         dd_dump_dmesg(f);
586525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         dd_close_file_stream(f);
587525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      }
588525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
589525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      /* Terminate the process to prevent future hangs. */
590525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      dd_kill_process();
591525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
592525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
593525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
594525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
595b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákdd_unreference_copy_of_call(struct dd_call *dst)
596b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
597b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   switch (dst->type) {
598b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_DRAW_VBO:
599b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_so_target_reference(&dst->info.draw_vbo.count_from_stream_output, NULL);
600b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.draw_vbo.indirect, NULL);
601b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.draw_vbo.indirect_params, NULL);
602b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
603b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_LAUNCH_GRID:
604b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.launch_grid.indirect, NULL);
605b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
606b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_RESOURCE_COPY_REGION:
607b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.resource_copy_region.dst, NULL);
608b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.resource_copy_region.src, NULL);
609b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
610b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_BLIT:
611b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.blit.dst.resource, NULL);
612b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.blit.src.resource, NULL);
613b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
614b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_FLUSH_RESOURCE:
615b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.flush_resource, NULL);
616b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
617b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_CLEAR:
618b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
619b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_CLEAR_BUFFER:
620b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.clear_buffer.res, NULL);
621b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
622b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_CLEAR_RENDER_TARGET:
623b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
624b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_CLEAR_DEPTH_STENCIL:
625b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
626b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_GENERATE_MIPMAP:
627b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.generate_mipmap.res, NULL);
628b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
629b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
630b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
631b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
632b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstatic void
633b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákdd_copy_call(struct dd_call *dst, struct dd_call *src)
634b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
635b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dst->type = src->type;
636b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
637b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   switch (src->type) {
638b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_DRAW_VBO:
639b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_so_target_reference(&dst->info.draw_vbo.count_from_stream_output,
640b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                               src->info.draw_vbo.count_from_stream_output);
641b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.draw_vbo.indirect,
642b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.draw_vbo.indirect);
643b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.draw_vbo.indirect_params,
644b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.draw_vbo.indirect_params);
645b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->info.draw_vbo = src->info.draw_vbo;
646b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
647b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_LAUNCH_GRID:
648b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.launch_grid.indirect,
649b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.launch_grid.indirect);
650b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->info.launch_grid = src->info.launch_grid;
651b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
652b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_RESOURCE_COPY_REGION:
653b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.resource_copy_region.dst,
654b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.resource_copy_region.dst);
655b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.resource_copy_region.src,
656b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.resource_copy_region.src);
657b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->info.resource_copy_region = src->info.resource_copy_region;
658b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
659b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_BLIT:
660b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.blit.dst.resource,
661b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.blit.dst.resource);
662b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.blit.src.resource,
663b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.blit.src.resource);
664b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->info.blit = src->info.blit;
665b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
666b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_FLUSH_RESOURCE:
667b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.flush_resource,
668b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.flush_resource);
669b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
670b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_CLEAR:
671b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->info.clear = src->info.clear;
672b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
673b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_CLEAR_BUFFER:
674b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.clear_buffer.res,
675b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.clear_buffer.res);
676b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->info.clear_buffer = src->info.clear_buffer;
677b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
678b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_CLEAR_RENDER_TARGET:
679b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
680b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_CLEAR_DEPTH_STENCIL:
681b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
682b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case CALL_GENERATE_MIPMAP:
683b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->info.generate_mipmap.res,
684b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->info.generate_mipmap.res);
685b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->info.generate_mipmap = src->info.generate_mipmap;
686b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      break;
687b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
688b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
689b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
690b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstatic void
691b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákdd_init_copy_of_draw_state(struct dd_draw_state_copy *state)
692b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
693b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   unsigned i,j;
694b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
695b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* Just clear pointers to gallium objects. Don't clear the whole structure,
696b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * because it would kill performance with its size of 130 KB.
697b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    */
698b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(&state->base.index_buffer, 0,
699b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          sizeof(state->base.index_buffer));
700b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(state->base.vertex_buffers, 0,
701b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          sizeof(state->base.vertex_buffers));
702b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(state->base.so_targets, 0,
703b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          sizeof(state->base.so_targets));
704b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(state->base.constant_buffers, 0,
705b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          sizeof(state->base.constant_buffers));
706b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(state->base.sampler_views, 0,
707b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          sizeof(state->base.sampler_views));
708b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(state->base.shader_images, 0,
709b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          sizeof(state->base.shader_images));
710b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(state->base.shader_buffers, 0,
711b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          sizeof(state->base.shader_buffers));
712b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(&state->base.framebuffer_state, 0,
713b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          sizeof(state->base.framebuffer_state));
714b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
715b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(state->shaders, 0, sizeof(state->shaders));
716b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
717b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   state->base.render_cond.query = &state->render_cond;
718b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
719b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
720b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      state->base.shaders[i] = &state->shaders[i];
721b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      for (j = 0; j < PIPE_MAX_SAMPLERS; j++)
722b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         state->base.sampler_states[i][j] = &state->sampler_states[i][j];
723b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
724b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
725b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   state->base.velems = &state->velems;
726b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   state->base.rs = &state->rs;
727b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   state->base.dsa = &state->dsa;
728b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   state->base.blend = &state->blend;
729b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
730b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
731b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstatic void
732b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákdd_unreference_copy_of_draw_state(struct dd_draw_state_copy *state)
733b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
734b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_draw_state *dst = &state->base;
735b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   unsigned i,j;
736b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
737b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   util_set_index_buffer(&dst->index_buffer, NULL);
738b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
739b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   for (i = 0; i < ARRAY_SIZE(dst->vertex_buffers); i++)
740b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->vertex_buffers[i].buffer, NULL);
741b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   for (i = 0; i < ARRAY_SIZE(dst->so_targets); i++)
742b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_so_target_reference(&dst->so_targets[i], NULL);
743b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
744b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
745b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      if (dst->shaders[i])
746b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         tgsi_free_tokens(dst->shaders[i]->state.shader.tokens);
747b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
748b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      for (j = 0; j < PIPE_MAX_CONSTANT_BUFFERS; j++)
749b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         pipe_resource_reference(&dst->constant_buffers[i][j].buffer, NULL);
750b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      for (j = 0; j < PIPE_MAX_SAMPLERS; j++)
751b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         pipe_sampler_view_reference(&dst->sampler_views[i][j], NULL);
752b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      for (j = 0; j < PIPE_MAX_SHADER_IMAGES; j++)
753b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         pipe_resource_reference(&dst->shader_images[i][j].resource, NULL);
754b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      for (j = 0; j < PIPE_MAX_SHADER_BUFFERS; j++)
755b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         pipe_resource_reference(&dst->shader_buffers[i][j].buffer, NULL);
756b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
757b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
758b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   util_unreference_framebuffer_state(&dst->framebuffer_state);
759b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
760b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
761b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstatic void
762b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákdd_copy_draw_state(struct dd_draw_state *dst, struct dd_draw_state *src)
763b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
764b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   unsigned i,j;
765b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
766b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   if (src->render_cond.query) {
767b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      *dst->render_cond.query = *src->render_cond.query;
768b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->render_cond.condition = src->render_cond.condition;
769b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->render_cond.mode = src->render_cond.mode;
770b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   } else {
771b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->render_cond.query = NULL;
772b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
773b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
774b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   util_set_index_buffer(&dst->index_buffer, &src->index_buffer);
775b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
776b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   for (i = 0; i < ARRAY_SIZE(src->vertex_buffers); i++) {
777b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_resource_reference(&dst->vertex_buffers[i].buffer,
778b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                              src->vertex_buffers[i].buffer);
779b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      memcpy(&dst->vertex_buffers[i], &src->vertex_buffers[i],
780b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák             sizeof(src->vertex_buffers[i]));
781b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
782b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
783b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dst->num_so_targets = src->num_so_targets;
784b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   for (i = 0; i < ARRAY_SIZE(src->so_targets); i++)
785b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_so_target_reference(&dst->so_targets[i], src->so_targets[i]);
786b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memcpy(dst->so_offsets, src->so_offsets, sizeof(src->so_offsets));
787b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
788b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
789b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      if (!src->shaders[i]) {
790b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         dst->shaders[i] = NULL;
791b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         continue;
792b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      }
793b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
794b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      if (src->shaders[i]) {
795b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         dst->shaders[i]->state.shader = src->shaders[i]->state.shader;
796b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         dst->shaders[i]->state.shader.tokens =
797b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            tgsi_dup_tokens(src->shaders[i]->state.shader.tokens);
798b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      } else {
799b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         dst->shaders[i] = NULL;
800b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      }
801b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
802b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      for (j = 0; j < PIPE_MAX_CONSTANT_BUFFERS; j++) {
803b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         pipe_resource_reference(&dst->constant_buffers[i][j].buffer,
804b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                                 src->constant_buffers[i][j].buffer);
805b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         memcpy(&dst->constant_buffers[i][j], &src->constant_buffers[i][j],
806b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                sizeof(src->constant_buffers[i][j]));
807b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      }
808b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
809b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      for (j = 0; j < PIPE_MAX_SAMPLERS; j++) {
810b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         pipe_sampler_view_reference(&dst->sampler_views[i][j],
811b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                                     src->sampler_views[i][j]);
812b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         if (src->sampler_states[i][j])
813b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            dst->sampler_states[i][j]->state.sampler =
814b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák               src->sampler_states[i][j]->state.sampler;
815b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         else
816b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            dst->sampler_states[i][j] = NULL;
817b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      }
818c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák
819c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák      for (j = 0; j < PIPE_MAX_SHADER_IMAGES; j++) {
820c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák         pipe_resource_reference(&dst->shader_images[i][j].resource,
821c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák                                 src->shader_images[i][j].resource);
822c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák         memcpy(&dst->shader_images[i][j], &src->shader_images[i][j],
823c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák                sizeof(src->shader_images[i][j]));
824c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák      }
825c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák
826c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák      for (j = 0; j < PIPE_MAX_SHADER_BUFFERS; j++) {
827c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák         pipe_resource_reference(&dst->shader_buffers[i][j].buffer,
828c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák                                 src->shader_buffers[i][j].buffer);
829c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák         memcpy(&dst->shader_buffers[i][j], &src->shader_buffers[i][j],
830c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák                sizeof(src->shader_buffers[i][j]));
831c723acc03dc39388e75d2c5919b99cd7b4d7e7ccMarek Olšák      }
832b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
833b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
834b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   if (src->velems)
835b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->velems->state.velems = src->velems->state.velems;
836b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   else
837b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->velems = NULL;
838b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
839b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   if (src->rs)
840b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->rs->state.rs = src->rs->state.rs;
841b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   else
842b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->rs = NULL;
843b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
844b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   if (src->dsa)
845b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->dsa->state.dsa = src->dsa->state.dsa;
846b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   else
847b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->dsa = NULL;
848b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
849b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   if (src->blend)
850b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->blend->state.blend = src->blend->state.blend;
851b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   else
852b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dst->blend = NULL;
853b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
854b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dst->blend_color = src->blend_color;
855b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dst->stencil_ref = src->stencil_ref;
856b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dst->sample_mask = src->sample_mask;
857b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dst->min_samples = src->min_samples;
858b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dst->clip_state = src->clip_state;
859b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   util_copy_framebuffer_state(&dst->framebuffer_state, &src->framebuffer_state);
860b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memcpy(dst->scissors, src->scissors, sizeof(src->scissors));
861b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memcpy(dst->viewports, src->viewports, sizeof(src->viewports));
862b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memcpy(dst->tess_default_levels, src->tess_default_levels,
863b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          sizeof(src->tess_default_levels));
864b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dst->apitrace_call_number = src->apitrace_call_number;
865b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
866b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
867b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstatic void
868b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákdd_free_record(struct dd_draw_record **record)
869b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
870b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_draw_record *next = (*record)->next;
871b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
872b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dd_unreference_copy_of_call(&(*record)->call);
873b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dd_unreference_copy_of_draw_state(&(*record)->draw_state);
874b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   FREE((*record)->driver_state_log);
875b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   FREE(*record);
876b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   *record = next;
877b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
878b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
879b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstatic void
880b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákdd_dump_record(struct dd_context *dctx, struct dd_draw_record *record,
881b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák               uint32_t hw_sequence_no, int64_t now)
882b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
883b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   FILE *f = dd_get_file_stream(dd_screen(dctx->base.screen),
884b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                                record->draw_state.base.apitrace_call_number);
885b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   if (!f)
886b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      return;
887b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
888b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   fprintf(f, "Draw call sequence # = %u\n", record->sequence_no);
889b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   fprintf(f, "HW reached sequence # = %u\n", hw_sequence_no);
890b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   fprintf(f, "Elapsed time = %"PRIi64" ms\n\n",
891b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák           (now - record->timestamp) / 1000);
892b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
893b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dd_dump_call(f, &record->draw_state.base, &record->call);
894b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   fprintf(f, "%s\n", record->driver_state_log);
895b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
896b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dctx->pipe->dump_debug_state(dctx->pipe, f,
897b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                                PIPE_DUMP_DEVICE_STATUS_REGISTERS);
898b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dd_dump_dmesg(f);
899b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   fclose(f);
900b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
901b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
902b47727a83ad6b5386f27b2c174a5c0f110a61038Marek OlšákPIPE_THREAD_ROUTINE(dd_thread_pipelined_hang_detect, input)
903b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
904b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_context *dctx = (struct dd_context *)input;
905b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_screen *dscreen = dd_screen(dctx->base.screen);
906b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
907b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   pipe_mutex_lock(dctx->mutex);
908b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
909b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   while (!dctx->kill_thread) {
910b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      struct dd_draw_record **record = &dctx->records;
911b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
912b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      /* Loop over all records. */
913b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      while (*record) {
914b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         int64_t now;
915b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
916b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         /* If the fence has been signalled, release the record and all older
917b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          * records.
918b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák          */
919b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         if (*dctx->mapped_fence >= (*record)->sequence_no) {
920b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            while (*record)
921b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák               dd_free_record(record);
922b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            break;
923b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         }
924b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
925b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         /* The fence hasn't been signalled. Check the timeout. */
926b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         now = os_time_get();
927b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         if (os_time_timeout((*record)->timestamp,
928b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                             (*record)->timestamp + dscreen->timeout_ms * 1000,
929b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                             now)) {
930b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            fprintf(stderr, "GPU hang detected.\n");
931b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
932b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            /* Get the oldest unsignalled draw call. */
933b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            while ((*record)->next &&
934b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák                   *dctx->mapped_fence < (*record)->next->sequence_no)
935b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák               record = &(*record)->next;
936b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
937b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            dd_dump_record(dctx, *record, *dctx->mapped_fence, now);
938b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák            dd_kill_process();
939b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         }
940b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
941b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         record = &(*record)->next;
942b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      }
943b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
944b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      /* Unlock and sleep before starting all over again. */
945b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_mutex_unlock(dctx->mutex);
946b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      os_time_sleep(10000); /* 10 ms */
947b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      pipe_mutex_lock(dctx->mutex);
948b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
949b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
950b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* Thread termination. */
951b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   while (dctx->records)
952b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dd_free_record(&dctx->records);
953b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
954b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   pipe_mutex_unlock(dctx->mutex);
955b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   return 0;
956b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
957b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
958b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstatic char *
959b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákdd_get_driver_shader_log(struct dd_context *dctx)
960b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
961840353059a35453e8a960673474e8a37d6f1a97aMarek Olšák#if defined(PIPE_OS_LINUX)
962b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   FILE *f;
963b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   char *buf;
964b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   int written_bytes;
965b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
966b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   if (!dctx->max_log_buffer_size)
967b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dctx->max_log_buffer_size = 16 * 1024;
968b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
969b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* Keep increasing the buffer size until there is enough space.
970b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    *
971b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * open_memstream can resize automatically, but it's VERY SLOW.
972b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * fmemopen is much faster.
973b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    */
974b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   while (1) {
975b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      buf = malloc(dctx->max_log_buffer_size);
976b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      buf[0] = 0;
977b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
978b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      f = fmemopen(buf, dctx->max_log_buffer_size, "a");
979b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      if (!f) {
980b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         free(buf);
981b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         return NULL;
982b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      }
983b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
984b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dd_dump_driver_state(dctx, f, PIPE_DUMP_CURRENT_SHADERS);
985b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      written_bytes = ftell(f);
986b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      fclose(f);
987b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
988b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      /* Return if the backing buffer is large enough. */
989b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      if (written_bytes < dctx->max_log_buffer_size - 1)
990b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         break;
991b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
992b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      /* Try again. */
993b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      free(buf);
994b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      dctx->max_log_buffer_size *= 2;
995b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
996b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
997b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   return buf;
998840353059a35453e8a960673474e8a37d6f1a97aMarek Olšák#else
999840353059a35453e8a960673474e8a37d6f1a97aMarek Olšák   /* Return an empty string. */
1000840353059a35453e8a960673474e8a37d6f1a97aMarek Olšák   return (char*)calloc(1, 4);
1001840353059a35453e8a960673474e8a37d6f1a97aMarek Olšák#endif
1002b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
1003b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
1004b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstatic void
1005b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákdd_pipelined_process_draw(struct dd_context *dctx, struct dd_call *call)
1006b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
1007b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1008b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_draw_record *record;
1009b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   char *log;
1010b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
1011b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* Make a record of the draw call. */
1012b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   record = MALLOC_STRUCT(dd_draw_record);
1013b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   if (!record)
1014b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      return;
1015b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
1016b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* Create the log. */
1017b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   log = dd_get_driver_shader_log(dctx);
1018b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   if (!log) {
1019b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      FREE(record);
1020b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      return;
1021b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   }
1022b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
1023b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* Update the fence with the GPU.
1024b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    *
1025b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * radeonsi/clear_buffer waits in the command processor until shaders are
1026b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * idle before writing to memory. That's a necessary condition for isolating
1027b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * draw calls.
1028b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    */
1029b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dctx->sequence_no++;
1030b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   pipe->clear_buffer(pipe, dctx->fence, 0, 4, &dctx->sequence_no, 4);
1031b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
1032b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* Initialize the record. */
1033b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   record->timestamp = os_time_get();
1034b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   record->sequence_no = dctx->sequence_no;
1035b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   record->driver_state_log = log;
1036b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
1037b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   memset(&record->call, 0, sizeof(record->call));
1038b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dd_copy_call(&record->call, call);
1039b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
1040b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dd_init_copy_of_draw_state(&record->draw_state);
1041b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dd_copy_draw_state(&record->draw_state.base, &dctx->draw_state);
1042b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
1043b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* Add the record to the list. */
1044b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   pipe_mutex_lock(dctx->mutex);
1045b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   record->next = dctx->records;
1046b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   dctx->records = record;
1047b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   pipe_mutex_unlock(dctx->mutex);
1048b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák}
1049b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
1050b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstatic void
1051525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_flush(struct pipe_context *_pipe,
1052525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                 struct pipe_fence_handle **fence, unsigned flags)
1053525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1054525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
1055525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1056525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1057525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   switch (dd_screen(dctx->base.screen)->mode) {
1058525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case DD_DETECT_HANGS:
1059525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      dd_flush_and_handle_hang(dctx, fence, flags,
1060525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                               "GPU hang detected in pipe->flush()");
1061525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      break;
1062b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   case DD_DETECT_HANGS_PIPELINED: /* nothing to do here */
1063525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   case DD_DUMP_ALL_CALLS:
1064642cf400aa806281720acbe599a35a6a176c04b3Marek Olšák   case DD_DUMP_APITRACE_CALL:
1065525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      pipe->flush(pipe, fence, flags);
1066525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      break;
1067525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   default:
1068525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      assert(0);
1069525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
1070525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1071525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1072525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1073525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_before_draw(struct dd_context *dctx)
1074525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1075b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle   struct dd_screen *dscreen = dd_screen(dctx->base.screen);
1076b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle
1077b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle   if (dscreen->mode == DD_DETECT_HANGS &&
1078b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle       !dscreen->no_flush &&
1079b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle       dctx->num_draw_calls >= dscreen->skip_count)
1080525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      dd_flush_and_handle_hang(dctx, NULL, 0,
1081525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                               "GPU hang most likely caused by internal "
1082525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                               "driver commands");
1083525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1084525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1085525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1086525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_after_draw(struct dd_context *dctx, struct dd_call *call)
1087525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1088b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle   struct dd_screen *dscreen = dd_screen(dctx->base.screen);
1089f4c8fa4e49bf4a938bb0ec9ee7ff686e7c8007dcNicolai Hähnle   struct pipe_context *pipe = dctx->pipe;
1090525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1091b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle   if (dctx->num_draw_calls >= dscreen->skip_count) {
1092b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle      switch (dscreen->mode) {
1093b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle      case DD_DETECT_HANGS:
1094b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle         if (!dscreen->no_flush &&
1095b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle            dd_flush_and_check_hang(dctx, NULL, 0)) {
1096d50f9e9b04266756e16c3afaead8f20944e0f562Marek Olšák            dd_write_report(dctx, call,
10976bf81de339289b0d005553414ce568b136a0ca5fMarek Olšák                         PIPE_DUMP_DEVICE_STATUS_REGISTERS |
10986bf81de339289b0d005553414ce568b136a0ca5fMarek Olšák                         PIPE_DUMP_CURRENT_STATES |
10996bf81de339289b0d005553414ce568b136a0ca5fMarek Olšák                         PIPE_DUMP_CURRENT_SHADERS |
1100f7720948cca971606c90b96c67128b93737af09dMarek Olšák                         PIPE_DUMP_LAST_COMMAND_BUFFER,
1101f7720948cca971606c90b96c67128b93737af09dMarek Olšák                         true);
1102b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle
1103b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle            /* Terminate the process to prevent future hangs. */
1104b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle            dd_kill_process();
1105b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle         }
1106b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle         break;
1107b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák      case DD_DETECT_HANGS_PIPELINED:
1108b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         dd_pipelined_process_draw(dctx, call);
1109b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák         break;
1110b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle      case DD_DUMP_ALL_CALLS:
1111f4c8fa4e49bf4a938bb0ec9ee7ff686e7c8007dcNicolai Hähnle         if (!dscreen->no_flush)
1112f4c8fa4e49bf4a938bb0ec9ee7ff686e7c8007dcNicolai Hähnle            pipe->flush(pipe, NULL, 0);
111310e5f126dd08849d9d209c8c0b80f2d2f6527571Marek Olšák         dd_write_report(dctx, call,
111410e5f126dd08849d9d209c8c0b80f2d2f6527571Marek Olšák                         PIPE_DUMP_CURRENT_STATES |
111510e5f126dd08849d9d209c8c0b80f2d2f6527571Marek Olšák                         PIPE_DUMP_CURRENT_SHADERS |
111610e5f126dd08849d9d209c8c0b80f2d2f6527571Marek Olšák                         PIPE_DUMP_LAST_COMMAND_BUFFER,
111710e5f126dd08849d9d209c8c0b80f2d2f6527571Marek Olšák                         false);
1118b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle         break;
1119642cf400aa806281720acbe599a35a6a176c04b3Marek Olšák      case DD_DUMP_APITRACE_CALL:
112095c3025a4163128584900b8f377d299c8e707d17Marek Olšák         if (dscreen->apitrace_dump_call ==
112195c3025a4163128584900b8f377d299c8e707d17Marek Olšák             dctx->draw_state.apitrace_call_number) {
112206b2fd04f6bc2f511f0c67a9b18f01b8f7296edcMarek Olšák            dd_write_report(dctx, call,
112306b2fd04f6bc2f511f0c67a9b18f01b8f7296edcMarek Olšák                            PIPE_DUMP_CURRENT_STATES |
112406b2fd04f6bc2f511f0c67a9b18f01b8f7296edcMarek Olšák                            PIPE_DUMP_CURRENT_SHADERS,
112506b2fd04f6bc2f511f0c67a9b18f01b8f7296edcMarek Olšák                            false);
1126642cf400aa806281720acbe599a35a6a176c04b3Marek Olšák            /* No need to continue. */
1127642cf400aa806281720acbe599a35a6a176c04b3Marek Olšák            exit(0);
1128642cf400aa806281720acbe599a35a6a176c04b3Marek Olšák         }
1129642cf400aa806281720acbe599a35a6a176c04b3Marek Olšák         break;
1130b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle      default:
1131b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle         assert(0);
1132525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      }
1133525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   }
1134b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle
1135b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle   ++dctx->num_draw_calls;
1136d640f179d314abef4d82bf3237197f1278415d36Nicolai Hähnle   if (dscreen->skip_count && dctx->num_draw_calls % 10000 == 0)
1137d640f179d314abef4d82bf3237197f1278415d36Nicolai Hähnle      fprintf(stderr, "Gallium debugger reached %u draw calls.\n",
1138d640f179d314abef4d82bf3237197f1278415d36Nicolai Hähnle              dctx->num_draw_calls);
1139525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1140525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1141525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1142525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_draw_vbo(struct pipe_context *_pipe,
1143525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                    const struct pipe_draw_info *info)
1144525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1145525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
1146525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1147525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_call call;
1148525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1149525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.type = CALL_DRAW_VBO;
1150525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.draw_vbo = *info;
1151525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1152525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_before_draw(dctx);
1153525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   pipe->draw_vbo(pipe, info);
1154525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_after_draw(dctx, &call);
1155525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1156525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1157525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1158ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizendd_context_launch_grid(struct pipe_context *_pipe,
1159ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen                       const struct pipe_grid_info *info)
1160ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen{
1161ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   struct dd_context *dctx = dd_context(_pipe);
1162ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   struct pipe_context *pipe = dctx->pipe;
1163ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   struct dd_call call;
1164ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen
1165ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   call.type = CALL_LAUNCH_GRID;
1166ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   call.info.launch_grid = *info;
1167ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen
1168ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   dd_before_draw(dctx);
1169ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   pipe->launch_grid(pipe, info);
1170ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   dd_after_draw(dctx, &call);
1171ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen}
1172ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen
1173ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizenstatic void
1174525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_resource_copy_region(struct pipe_context *_pipe,
1175525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                                struct pipe_resource *dst, unsigned dst_level,
1176525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                                unsigned dstx, unsigned dsty, unsigned dstz,
1177525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                                struct pipe_resource *src, unsigned src_level,
1178525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                                const struct pipe_box *src_box)
1179525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1180525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
1181525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1182525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_call call;
1183525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1184525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.type = CALL_RESOURCE_COPY_REGION;
1185525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.resource_copy_region.dst = dst;
1186525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.resource_copy_region.dst_level = dst_level;
1187525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.resource_copy_region.dstx = dstx;
1188525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.resource_copy_region.dsty = dsty;
1189525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.resource_copy_region.dstz = dstz;
1190525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.resource_copy_region.src = src;
1191525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.resource_copy_region.src_level = src_level;
11920795a3d54f7748d27020851f2e9b4b7637597590Marek Olšák   call.info.resource_copy_region.src_box = *src_box;
1193525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1194525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_before_draw(dctx);
1195525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   pipe->resource_copy_region(pipe,
1196525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                              dst, dst_level, dstx, dsty, dstz,
1197525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                              src, src_level, src_box);
1198525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_after_draw(dctx, &call);
1199525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1200525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1201525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1202525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_blit(struct pipe_context *_pipe, const struct pipe_blit_info *info)
1203525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1204525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
1205525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1206525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_call call;
1207525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1208525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.type = CALL_BLIT;
1209525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.blit = *info;
1210525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1211525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_before_draw(dctx);
1212525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   pipe->blit(pipe, info);
1213525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_after_draw(dctx, &call);
1214525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1215525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
12161daec2b795a2c029b89202a15142376ac701bc39Marek Olšákstatic boolean
12171daec2b795a2c029b89202a15142376ac701bc39Marek Olšákdd_context_generate_mipmap(struct pipe_context *_pipe,
12181daec2b795a2c029b89202a15142376ac701bc39Marek Olšák                           struct pipe_resource *res,
12191daec2b795a2c029b89202a15142376ac701bc39Marek Olšák                           enum pipe_format format,
12201daec2b795a2c029b89202a15142376ac701bc39Marek Olšák                           unsigned base_level,
12211daec2b795a2c029b89202a15142376ac701bc39Marek Olšák                           unsigned last_level,
12221daec2b795a2c029b89202a15142376ac701bc39Marek Olšák                           unsigned first_layer,
12231daec2b795a2c029b89202a15142376ac701bc39Marek Olšák                           unsigned last_layer)
12241daec2b795a2c029b89202a15142376ac701bc39Marek Olšák{
12251daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
12261daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   struct pipe_context *pipe = dctx->pipe;
12271daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   struct dd_call call;
12281daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   boolean result;
12291daec2b795a2c029b89202a15142376ac701bc39Marek Olšák
12301daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   call.type = CALL_GENERATE_MIPMAP;
12311daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   call.info.generate_mipmap.res = res;
12321daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   call.info.generate_mipmap.format = format;
12331daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   call.info.generate_mipmap.base_level = base_level;
12341daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   call.info.generate_mipmap.last_level = last_level;
12351daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   call.info.generate_mipmap.first_layer = first_layer;
12361daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   call.info.generate_mipmap.last_layer = last_layer;
12371daec2b795a2c029b89202a15142376ac701bc39Marek Olšák
12381daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   dd_before_draw(dctx);
12391daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   result = pipe->generate_mipmap(pipe, res, format, base_level, last_level,
12401daec2b795a2c029b89202a15142376ac701bc39Marek Olšák                                  first_layer, last_layer);
12411daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   dd_after_draw(dctx, &call);
12421daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   return result;
12431daec2b795a2c029b89202a15142376ac701bc39Marek Olšák}
12441daec2b795a2c029b89202a15142376ac701bc39Marek Olšák
1245525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1246525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_flush_resource(struct pipe_context *_pipe,
1247525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                          struct pipe_resource *resource)
1248525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1249525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
1250525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1251525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_call call;
1252525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1253525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.type = CALL_FLUSH_RESOURCE;
1254525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.flush_resource = resource;
1255525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1256525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_before_draw(dctx);
1257525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   pipe->flush_resource(pipe, resource);
1258525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_after_draw(dctx, &call);
1259525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1260525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1261525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1262525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_clear(struct pipe_context *_pipe, unsigned buffers,
1263525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                 const union pipe_color_union *color, double depth,
1264525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                 unsigned stencil)
1265525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1266525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
1267525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1268525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_call call;
1269525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1270525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.type = CALL_CLEAR;
1271525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.clear.buffers = buffers;
12720795a3d54f7748d27020851f2e9b4b7637597590Marek Olšák   call.info.clear.color = *color;
1273525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.clear.depth = depth;
1274525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.clear.stencil = stencil;
1275525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1276525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_before_draw(dctx);
1277525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   pipe->clear(pipe, buffers, color, depth, stencil);
1278525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_after_draw(dctx, &call);
1279525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1280525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1281525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1282525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_clear_render_target(struct pipe_context *_pipe,
1283525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                               struct pipe_surface *dst,
1284525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                               const union pipe_color_union *color,
1285525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                               unsigned dstx, unsigned dsty,
1286a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák                               unsigned width, unsigned height,
1287a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák                               bool render_condition_enabled)
1288525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1289525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
1290525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1291525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_call call;
1292525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1293525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.type = CALL_CLEAR_RENDER_TARGET;
1294525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1295525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_before_draw(dctx);
1296a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák   pipe->clear_render_target(pipe, dst, color, dstx, dsty, width, height,
1297a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák                             render_condition_enabled);
1298525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_after_draw(dctx, &call);
1299525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1300525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1301525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1302525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_clear_depth_stencil(struct pipe_context *_pipe,
1303525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                               struct pipe_surface *dst, unsigned clear_flags,
1304525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                               double depth, unsigned stencil, unsigned dstx,
1305a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák                               unsigned dsty, unsigned width, unsigned height,
1306a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák                               bool render_condition_enabled)
1307525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1308525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
1309525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1310525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_call call;
1311525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1312525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.type = CALL_CLEAR_DEPTH_STENCIL;
1313525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1314525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_before_draw(dctx);
1315525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   pipe->clear_depth_stencil(pipe, dst, clear_flags, depth, stencil,
1316a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák                             dstx, dsty, width, height,
1317a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák                             render_condition_enabled);
1318525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_after_draw(dctx, &call);
1319525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1320525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1321525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic void
1322525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_clear_buffer(struct pipe_context *_pipe, struct pipe_resource *res,
1323525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                        unsigned offset, unsigned size,
1324525921ed51176255474c73adacfc6801a7bf2783Marek Olšák                        const void *clear_value, int clear_value_size)
1325525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1326525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_context *dctx = dd_context(_pipe);
1327525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_context *pipe = dctx->pipe;
1328525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_call call;
1329525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1330525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.type = CALL_CLEAR_BUFFER;
1331525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.clear_buffer.res = res;
1332525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.clear_buffer.offset = offset;
1333525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.clear_buffer.size = size;
1334525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.clear_buffer.clear_value = clear_value;
1335525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   call.info.clear_buffer.clear_value_size = clear_value_size;
1336525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1337525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_before_draw(dctx);
1338525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   pipe->clear_buffer(pipe, res, offset, size, clear_value, clear_value_size);
1339525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dd_after_draw(dctx, &call);
1340525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1341525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
1342525921ed51176255474c73adacfc6801a7bf2783Marek Olšákvoid
1343525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_init_draw_functions(struct dd_context *dctx)
1344525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
1345525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   CTX_INIT(flush);
1346525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   CTX_INIT(draw_vbo);
1347ac77fb74a018c37bbc0d42d9d4fafc1b8511ad3fBas Nieuwenhuizen   CTX_INIT(launch_grid);
1348525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   CTX_INIT(resource_copy_region);
1349525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   CTX_INIT(blit);
1350525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   CTX_INIT(clear);
1351525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   CTX_INIT(clear_render_target);
1352525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   CTX_INIT(clear_depth_stencil);
1353525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   CTX_INIT(clear_buffer);
1354525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   CTX_INIT(flush_resource);
13551daec2b795a2c029b89202a15142376ac701bc39Marek Olšák   CTX_INIT(generate_mipmap);
1356525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
1357