r600g: fix r600 context structure, avoid segfault when no scissor
[mesa.git] / src / gallium / drivers / r600 / r600_context.h
1 /*
2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23 #ifndef R600_CONTEXT_H
24 #define R600_CONTEXT_H
25
26 #include <stdio.h>
27 #include <pipe/p_state.h>
28 #include <pipe/p_context.h>
29 #include <tgsi/tgsi_scan.h>
30 #include <tgsi/tgsi_parse.h>
31 #include <tgsi/tgsi_util.h>
32 #include <util/u_blitter.h>
33 #include "radeon.h"
34 #include "r600_shader.h"
35
36 /* XXX move this to a more appropriate place */
37 union pipe_states {
38 struct pipe_rasterizer_state rasterizer;
39 struct pipe_poly_stipple poly_stipple;
40 struct pipe_scissor_state scissor;
41 struct pipe_clip_state clip;
42 struct pipe_shader_state shader;
43 struct pipe_depth_state depth;
44 struct pipe_stencil_state stencil;
45 struct pipe_alpha_state alpha;
46 struct pipe_depth_stencil_alpha_state dsa;
47 struct pipe_blend_state blend;
48 struct pipe_blend_color blend_color;
49 struct pipe_stencil_ref stencil_ref;
50 struct pipe_framebuffer_state framebuffer;
51 struct pipe_sampler_state sampler;
52 struct pipe_sampler_view sampler_view;
53 struct pipe_viewport_state viewport;
54 };
55
56 enum pipe_state_type {
57 pipe_rasterizer_type = 1,
58 pipe_poly_stipple_type,
59 pipe_scissor_type,
60 pipe_clip_type,
61 pipe_shader_type,
62 pipe_depth_type,
63 pipe_stencil_type,
64 pipe_alpha_type,
65 pipe_dsa_type,
66 pipe_blend_type,
67 pipe_stencil_ref_type,
68 pipe_framebuffer_type,
69 pipe_sampler_type,
70 pipe_sampler_view_type,
71 pipe_viewport_type,
72 pipe_type_count
73 };
74
75 struct r600_context_state {
76 union pipe_states state;
77 unsigned refcount;
78 unsigned type;
79 struct radeon_state *rstate;
80 struct r600_shader shader;
81 struct radeon_bo *bo;
82 };
83
84 struct r600_vertex_element
85 {
86 unsigned refcount;
87 unsigned count;
88 struct pipe_vertex_element elements[32];
89 };
90
91 struct r600_context_hw_states {
92 struct radeon_state *rasterizer;
93 struct radeon_state *scissor;
94 struct radeon_state *dsa;
95 struct radeon_state *blend;
96 struct radeon_state *viewport;
97 struct radeon_state *cb[8];
98 struct radeon_state *config;
99 struct radeon_state *cb_cntl;
100 struct radeon_state *db;
101 unsigned ps_nresource;
102 unsigned ps_nsampler;
103 struct radeon_state *ps_resource[160];
104 struct radeon_state *ps_sampler[16];
105 };
106
107 struct r600_context {
108 struct pipe_context context;
109 struct r600_screen *screen;
110 struct radeon *rw;
111 struct radeon_ctx *ctx;
112 struct blitter_context *blitter;
113 struct radeon_draw *draw;
114 /* hw states */
115 struct r600_context_hw_states hw_states;
116 /* pipe states */
117 unsigned flat_shade;
118 unsigned ps_nsampler;
119 unsigned vs_nsampler;
120 unsigned ps_nsampler_view;
121 unsigned vs_nsampler_view;
122 unsigned nvertex_buffer;
123 struct r600_context_state *rasterizer;
124 struct r600_context_state *poly_stipple;
125 struct r600_context_state *scissor;
126 struct r600_context_state *clip;
127 struct r600_context_state *ps_shader;
128 struct r600_context_state *vs_shader;
129 struct r600_context_state *depth;
130 struct r600_context_state *stencil;
131 struct r600_context_state *alpha;
132 struct r600_context_state *dsa;
133 struct r600_context_state *blend;
134 struct r600_context_state *stencil_ref;
135 struct r600_context_state *viewport;
136 struct r600_context_state *framebuffer;
137 struct r600_context_state *ps_sampler[PIPE_MAX_ATTRIBS];
138 struct r600_context_state *vs_sampler[PIPE_MAX_ATTRIBS];
139 struct r600_context_state *ps_sampler_view[PIPE_MAX_ATTRIBS];
140 struct r600_context_state *vs_sampler_view[PIPE_MAX_ATTRIBS];
141 struct r600_vertex_element *vertex_elements;
142 struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
143 struct pipe_index_buffer index_buffer;
144 struct pipe_blend_color blend_color;
145 };
146
147 /* Convenience cast wrapper. */
148 static INLINE struct r600_context *r600_context(struct pipe_context *pipe)
149 {
150 return (struct r600_context*)pipe;
151 }
152
153 struct r600_context_state *r600_context_state(struct r600_context *rctx, unsigned type, const void *state);
154 struct r600_context_state *r600_context_state_incref(struct r600_context_state *rstate);
155 struct r600_context_state *r600_context_state_decref(struct r600_context_state *rstate);
156 void r600_flush(struct pipe_context *ctx, unsigned flags,
157 struct pipe_fence_handle **fence);
158
159 int r600_context_hw_states(struct r600_context *rctx);
160
161 void r600_draw_vbo(struct pipe_context *ctx,
162 const struct pipe_draw_info *info);
163
164 void r600_init_blit_functions(struct r600_context *rctx);
165 void r600_init_state_functions(struct r600_context *rctx);
166 void r600_init_query_functions(struct r600_context* rctx);
167 struct pipe_context *r600_create_context(struct pipe_screen *screen, void *priv);
168
169 extern int r600_pipe_shader_create(struct pipe_context *ctx,
170 struct r600_context_state *rstate,
171 const struct tgsi_token *tokens);
172 extern int r600_pipe_shader_update(struct pipe_context *ctx,
173 struct r600_context_state *rstate);
174
175 #define R600_ERR(fmt, args...) \
176 fprintf(stderr, "EE %s/%s:%d - "fmt, __FILE__, __func__, __LINE__, ##args)
177
178 #endif