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