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#ifndef DD_H_
29525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#define DD_H_
30525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
31525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#include "pipe/p_context.h"
32525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#include "pipe/p_state.h"
33525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#include "pipe/p_screen.h"
3489f73827d03e28af548cc11247ebd6e2825789afMarek Olšák#include "dd_util.h"
35b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák#include "os/os_thread.h"
36525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
37525921ed51176255474c73adacfc6801a7bf2783Marek Olšákenum dd_mode {
38525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   DD_DETECT_HANGS,
39b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   DD_DETECT_HANGS_PIPELINED,
40642cf400aa806281720acbe599a35a6a176c04b3Marek Olšák   DD_DUMP_ALL_CALLS,
41642cf400aa806281720acbe599a35a6a176c04b3Marek Olšák   DD_DUMP_APITRACE_CALL,
42525921ed51176255474c73adacfc6801a7bf2783Marek Olšák};
43525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
44525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstruct dd_screen
45525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
46525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_screen base;
47525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_screen *screen;
48525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   unsigned timeout_ms;
49525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   enum dd_mode mode;
50525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   bool no_flush;
5141875ac4edd8c884225c44c0840bd20291b410caNicolai Hähnle   bool verbose;
52b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle   unsigned skip_count;
53642cf400aa806281720acbe599a35a6a176c04b3Marek Olšák   unsigned apitrace_dump_call;
54525921ed51176255474c73adacfc6801a7bf2783Marek Olšák};
55525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
56e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšákenum call_type
57e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák{
58e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_DRAW_VBO,
59e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_LAUNCH_GRID,
60e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_RESOURCE_COPY_REGION,
61e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_BLIT,
62e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_FLUSH_RESOURCE,
63e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_CLEAR,
64e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_CLEAR_BUFFER,
65e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_CLEAR_RENDER_TARGET,
66e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_CLEAR_DEPTH_STENCIL,
67e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   CALL_GENERATE_MIPMAP,
68e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák};
69e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák
70e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšákstruct call_resource_copy_region
71e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák{
72e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   struct pipe_resource *dst;
73e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned dst_level;
74e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned dstx, dsty, dstz;
75e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   struct pipe_resource *src;
76e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned src_level;
770795a3d54f7748d27020851f2e9b4b7637597590Marek Olšák   struct pipe_box src_box;
78e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák};
79e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák
80e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšákstruct call_clear
81e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák{
82e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned buffers;
830795a3d54f7748d27020851f2e9b4b7637597590Marek Olšák   union pipe_color_union color;
84e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   double depth;
85e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned stencil;
86e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák};
87e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák
88e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšákstruct call_clear_buffer
89e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák{
90e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   struct pipe_resource *res;
91e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned offset;
92e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned size;
93e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   const void *clear_value;
94e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   int clear_value_size;
95e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák};
96e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák
97e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšákstruct call_generate_mipmap {
98e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   struct pipe_resource *res;
99e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   enum pipe_format format;
100e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned base_level;
101e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned last_level;
102e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned first_layer;
103e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   unsigned last_layer;
104e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák};
105e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák
106e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšákstruct dd_call
107e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák{
108e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   enum call_type type;
109e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák
110e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   union {
111e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák      struct pipe_draw_info draw_vbo;
112e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák      struct pipe_grid_info launch_grid;
113e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák      struct call_resource_copy_region resource_copy_region;
114e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák      struct pipe_blit_info blit;
115e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák      struct pipe_resource *flush_resource;
116e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák      struct call_clear clear;
117e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák      struct call_clear_buffer clear_buffer;
118e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák      struct call_generate_mipmap generate_mipmap;
119e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák   } info;
120e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák};
121e4079677a7819a79a4e59425688000f15ceb19d7Marek Olšák
122525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstruct dd_query
123525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
124525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   unsigned type;
125525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_query *query;
126525921ed51176255474c73adacfc6801a7bf2783Marek Olšák};
127525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
128525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstruct dd_state
129525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
130525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   void *cso;
131525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
132525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   union {
133525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      struct pipe_blend_state blend;
134525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      struct pipe_depth_stencil_alpha_state dsa;
135525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      struct pipe_rasterizer_state rs;
136525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      struct pipe_sampler_state sampler;
137525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      struct {
138525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         struct pipe_vertex_element velems[PIPE_MAX_ATTRIBS];
139525921ed51176255474c73adacfc6801a7bf2783Marek Olšák         unsigned count;
140525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      } velems;
141525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      struct pipe_shader_state shader;
142525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   } state;
143525921ed51176255474c73adacfc6801a7bf2783Marek Olšák};
144525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
14595c3025a4163128584900b8f377d299c8e707d17Marek Olšákstruct dd_draw_state
146525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
147525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct {
148525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      struct dd_query *query;
149525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      bool condition;
150525921ed51176255474c73adacfc6801a7bf2783Marek Olšák      unsigned mode;
151525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   } render_cond;
152525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
153525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_index_buffer index_buffer;
154525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
155525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
156525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   unsigned num_so_targets;
157525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_stream_output_target *so_targets[PIPE_MAX_SO_BUFFERS];
158525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   unsigned so_offsets[PIPE_MAX_SO_BUFFERS];
159525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
160525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_state *shaders[PIPE_SHADER_TYPES];
161525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_constant_buffer constant_buffers[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
162525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
163525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_state *sampler_states[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
164bceff68114d5daab7a52a42db422ec8f6dc22328Ilia Mirkin   struct pipe_image_view shader_images[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_IMAGES];
165525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_shader_buffer shader_buffers[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_BUFFERS];
166525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
167525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_state *velems;
168525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_state *rs;
169525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_state *dsa;
170525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct dd_state *blend;
171525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
172525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_blend_color blend_color;
173525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_stencil_ref stencil_ref;
174525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   unsigned sample_mask;
175525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   unsigned min_samples;
176525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_clip_state clip_state;
177525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_framebuffer_state framebuffer_state;
178525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_poly_stipple polygon_stipple;
179525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_scissor_state scissors[PIPE_MAX_VIEWPORTS];
180525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   struct pipe_viewport_state viewports[PIPE_MAX_VIEWPORTS];
181525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   float tess_default_levels[6];
182b86d5ccae2b6280ad26d1060295fcc4963e90011Nicolai Hähnle
18350b223547814cefc0e7130e199fabc4dbedf97ceMarek Olšák   unsigned apitrace_call_number;
184525921ed51176255474c73adacfc6801a7bf2783Marek Olšák};
185525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
186b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstruct dd_draw_state_copy
187b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák{
188b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_draw_state base;
189b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
190b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* dd_draw_state_copy does not reference real CSOs. Instead, it points to
191b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * these variables, which serve as storage.
192b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    */
193b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_query render_cond;
194b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_state shaders[PIPE_SHADER_TYPES];
195b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_state sampler_states[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
196b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_state velems;
197b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_state rs;
198b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_state dsa;
199b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_state blend;
200b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák};
201b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
202b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšákstruct dd_draw_record {
203b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_draw_record *next;
204b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
205b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   int64_t timestamp;
206b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   uint32_t sequence_no;
207b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
208b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_call call;
209b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_draw_state_copy draw_state;
210b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   char *driver_state_log;
211b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák};
212b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
21395c3025a4163128584900b8f377d299c8e707d17Marek Olšákstruct dd_context
21495c3025a4163128584900b8f377d299c8e707d17Marek Olšák{
21595c3025a4163128584900b8f377d299c8e707d17Marek Olšák   struct pipe_context base;
21695c3025a4163128584900b8f377d299c8e707d17Marek Olšák   struct pipe_context *pipe;
21795c3025a4163128584900b8f377d299c8e707d17Marek Olšák
21895c3025a4163128584900b8f377d299c8e707d17Marek Olšák   struct dd_draw_state draw_state;
21995c3025a4163128584900b8f377d299c8e707d17Marek Olšák   unsigned num_draw_calls;
220b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák
221b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   /* Pipelined hang detection.
222b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    *
223b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * This is without unnecessary flushes and waits. There is a memory-based
224b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * fence that is incremented by clear_buffer every draw call. Driver fences
225b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * are not used.
226b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    *
227b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * After each draw call, a new dd_draw_record is created that contains
228b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * a copy of all states, the output of pipe_context::dump_debug_state,
229b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * and it has a fence number assigned. That's done without knowing whether
230b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * that draw call is problematic or not. The record is added into the list
231b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * of all records.
232b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    *
233b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * An independent, separate thread loops over the list of records and checks
234b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * their fences. Records with signalled fences are freed. On fence timeout,
235b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    * the thread dumps the record of the oldest unsignalled fence.
236b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák    */
237b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   pipe_thread thread;
238b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   pipe_mutex mutex;
239b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   int kill_thread;
240b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct pipe_resource *fence;
241b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct pipe_transfer *fence_transfer;
242b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   uint32_t *mapped_fence;
243b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   uint32_t sequence_no;
244b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   struct dd_draw_record *records;
245b47727a83ad6b5386f27b2c174a5c0f110a61038Marek Olšák   int max_log_buffer_size;
24695c3025a4163128584900b8f377d299c8e707d17Marek Olšák};
24795c3025a4163128584900b8f377d299c8e707d17Marek Olšák
248525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
249525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstruct pipe_context *
250525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context_create(struct dd_screen *dscreen, struct pipe_context *pipe);
251525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
252525921ed51176255474c73adacfc6801a7bf2783Marek Olšákvoid
253525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_init_draw_functions(struct dd_context *dctx);
254b47727a83ad6b5386f27b2c174a5c0f110a61038Marek OlšákPIPE_THREAD_ROUTINE(dd_thread_pipelined_hang_detect, input);
255525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
256525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
257525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic inline struct dd_context *
258525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_context(struct pipe_context *pipe)
259525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
260525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   return (struct dd_context *)pipe;
261525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
262525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
263525921ed51176255474c73adacfc6801a7bf2783Marek Olšákstatic inline struct dd_screen *
264525921ed51176255474c73adacfc6801a7bf2783Marek Olšákdd_screen(struct pipe_screen *screen)
265525921ed51176255474c73adacfc6801a7bf2783Marek Olšák{
266525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   return (struct dd_screen*)screen;
267525921ed51176255474c73adacfc6801a7bf2783Marek Olšák}
268525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
269525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
270525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#define CTX_INIT(_member) \
271525921ed51176255474c73adacfc6801a7bf2783Marek Olšák   dctx->base._member = dctx->pipe->_member ? dd_context_##_member : NULL
272525921ed51176255474c73adacfc6801a7bf2783Marek Olšák
273525921ed51176255474c73adacfc6801a7bf2783Marek Olšák#endif /* DD_H_ */
274