Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 1 | /************************************************************************** |
2 | * |
||
3 | * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. |
||
4 | * All Rights Reserved. |
||
5 | * |
||
6 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
7 | * copy of this software and associated documentation files (the |
||
8 | * "Software"), to deal in the Software without restriction, including |
||
9 | * without limitation the rights to use, copy, modify, merge, publish, |
||
10 | * distribute, sub license, and/or sell copies of the Software, and to |
||
11 | * permit persons to whom the Software is furnished to do so, subject to |
||
12 | * the following conditions: |
||
13 | * |
||
14 | * The above copyright notice and this permission notice (including the |
||
15 | * next paragraph) shall be included in all copies or substantial portions |
||
16 | * of the Software. |
||
17 | * |
||
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
19 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||
20 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||
21 | * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR |
||
22 | * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||
23 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||
24 | * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
25 | * |
||
26 | **************************************************************************/ |
||
27 | |||
28 | #include "i915_context.h" |
||
29 | #include "i915_state.h" |
||
30 | #include "i915_screen.h" |
||
31 | #include "i915_surface.h" |
||
32 | #include "i915_query.h" |
||
33 | #include "i915_batch.h" |
||
34 | #include "i915_resource.h" |
||
35 | |||
36 | #include "draw/draw_context.h" |
||
37 | #include "pipe/p_defines.h" |
||
38 | #include "util/u_inlines.h" |
||
39 | #include "util/u_memory.h" |
||
40 | #include "pipe/p_screen.h" |
||
41 | |||
42 | |||
43 | DEBUG_GET_ONCE_BOOL_OPTION(i915_no_vbuf, "I915_NO_VBUF", FALSE) |
||
44 | |||
45 | |||
46 | /* |
||
47 | * Draw functions |
||
48 | */ |
||
49 | |||
50 | |||
51 | static void |
||
52 | i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) |
||
53 | { |
||
54 | struct i915_context *i915 = i915_context(pipe); |
||
55 | struct draw_context *draw = i915->draw; |
||
56 | const void *mapped_indices = NULL; |
||
57 | unsigned i; |
||
58 | |||
59 | /* |
||
60 | * Ack vs contants here, helps ipers a lot. |
||
61 | */ |
||
62 | i915->dirty &= ~I915_NEW_VS_CONSTANTS; |
||
63 | |||
64 | if (i915->dirty) |
||
65 | i915_update_derived(i915); |
||
66 | |||
67 | /* |
||
68 | * Map vertex buffers |
||
69 | */ |
||
70 | for (i = 0; i < i915->nr_vertex_buffers; i++) { |
||
71 | const void *buf = i915->vertex_buffers[i].user_buffer; |
||
72 | if (!buf) |
||
73 | buf = i915_buffer(i915->vertex_buffers[i].buffer)->data; |
||
74 | draw_set_mapped_vertex_buffer(draw, i, buf, ~0); |
||
75 | } |
||
76 | |||
77 | /* |
||
78 | * Map index buffer, if present |
||
79 | */ |
||
80 | if (info->indexed) { |
||
81 | mapped_indices = i915->index_buffer.user_buffer; |
||
82 | if (!mapped_indices) |
||
83 | mapped_indices = i915_buffer(i915->index_buffer.buffer)->data; |
||
84 | draw_set_indexes(draw, |
||
85 | (ubyte *) mapped_indices + i915->index_buffer.offset, |
||
86 | i915->index_buffer.index_size, ~0); |
||
87 | } |
||
88 | |||
89 | if (i915->constants[PIPE_SHADER_VERTEX]) |
||
90 | draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, |
||
91 | i915_buffer(i915->constants[PIPE_SHADER_VERTEX])->data, |
||
92 | (i915->current.num_user_constants[PIPE_SHADER_VERTEX] * |
||
93 | 4 * sizeof(float))); |
||
94 | else |
||
95 | draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, NULL, 0); |
||
96 | |||
97 | if (i915->num_vertex_sampler_views > 0) |
||
98 | i915_prepare_vertex_sampling(i915); |
||
99 | |||
100 | /* |
||
101 | * Do the drawing |
||
102 | */ |
||
103 | draw_vbo(i915->draw, info); |
||
104 | |||
105 | /* |
||
106 | * unmap vertex/index buffers |
||
107 | */ |
||
108 | for (i = 0; i < i915->nr_vertex_buffers; i++) { |
||
109 | draw_set_mapped_vertex_buffer(i915->draw, i, NULL, 0); |
||
110 | } |
||
111 | if (mapped_indices) |
||
112 | draw_set_indexes(draw, NULL, 0, 0); |
||
113 | |||
114 | if (i915->num_vertex_sampler_views > 0) |
||
115 | i915_cleanup_vertex_sampling(i915); |
||
116 | |||
117 | /* |
||
118 | * Instead of flushing on every state change, we flush once here |
||
119 | * when we fire the vbo. |
||
120 | */ |
||
121 | draw_flush(i915->draw); |
||
122 | } |
||
123 | |||
124 | |||
125 | /* |
||
126 | * Generic context functions |
||
127 | */ |
||
128 | |||
129 | |||
130 | static void i915_destroy(struct pipe_context *pipe) |
||
131 | { |
||
132 | struct i915_context *i915 = i915_context(pipe); |
||
133 | int i; |
||
134 | |||
135 | if (i915->blitter) |
||
136 | util_blitter_destroy(i915->blitter); |
||
137 | |||
138 | draw_destroy(i915->draw); |
||
139 | |||
140 | if(i915->batch) |
||
141 | i915->iws->batchbuffer_destroy(i915->batch); |
||
142 | |||
143 | /* unbind framebuffer */ |
||
144 | for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { |
||
145 | pipe_surface_reference(&i915->framebuffer.cbufs[i], NULL); |
||
146 | } |
||
147 | pipe_surface_reference(&i915->framebuffer.zsbuf, NULL); |
||
148 | |||
149 | /* unbind constant buffers */ |
||
150 | for (i = 0; i < PIPE_SHADER_TYPES; i++) { |
||
151 | pipe_resource_reference(&i915->constants[i], NULL); |
||
152 | } |
||
153 | |||
154 | FREE(i915); |
||
155 | } |
||
156 | |||
157 | struct pipe_context * |
||
158 | i915_create_context(struct pipe_screen *screen, void *priv) |
||
159 | { |
||
160 | struct i915_context *i915; |
||
161 | |||
162 | i915 = CALLOC_STRUCT(i915_context); |
||
163 | if (i915 == NULL) |
||
164 | return NULL; |
||
165 | |||
166 | i915->iws = i915_screen(screen)->iws; |
||
167 | i915->base.screen = screen; |
||
168 | i915->base.priv = priv; |
||
169 | |||
170 | i915->base.destroy = i915_destroy; |
||
171 | |||
172 | if (i915_screen(screen)->debug.use_blitter) |
||
173 | i915->base.clear = i915_clear_blitter; |
||
174 | else |
||
175 | i915->base.clear = i915_clear_render; |
||
176 | |||
177 | i915->base.draw_vbo = i915_draw_vbo; |
||
178 | |||
179 | /* init this before draw */ |
||
180 | util_slab_create(&i915->transfer_pool, sizeof(struct pipe_transfer), |
||
181 | 16, UTIL_SLAB_SINGLETHREADED); |
||
182 | util_slab_create(&i915->texture_transfer_pool, sizeof(struct i915_transfer), |
||
183 | 16, UTIL_SLAB_SINGLETHREADED); |
||
184 | |||
185 | /* Batch stream debugging is a bit hacked up at the moment: |
||
186 | */ |
||
187 | i915->batch = i915->iws->batchbuffer_create(i915->iws); |
||
188 | |||
189 | /* |
||
190 | * Create drawing context and plug our rendering stage into it. |
||
191 | */ |
||
192 | i915->draw = draw_create(&i915->base); |
||
193 | assert(i915->draw); |
||
194 | if (!debug_get_option_i915_no_vbuf()) { |
||
195 | draw_set_rasterize_stage(i915->draw, i915_draw_vbuf_stage(i915)); |
||
196 | } else { |
||
197 | draw_set_rasterize_stage(i915->draw, i915_draw_render_stage(i915)); |
||
198 | } |
||
199 | |||
200 | i915_init_surface_functions(i915); |
||
201 | i915_init_state_functions(i915); |
||
202 | i915_init_flush_functions(i915); |
||
203 | i915_init_resource_functions(i915); |
||
204 | i915_init_query_functions(i915); |
||
205 | |||
206 | /* Create blitter. */ |
||
207 | i915->blitter = util_blitter_create(&i915->base); |
||
208 | assert(i915->blitter); |
||
209 | |||
210 | /* must be done before installing Draw stages */ |
||
211 | util_blitter_cache_all_shaders(i915->blitter); |
||
212 | |||
213 | draw_install_aaline_stage(i915->draw, &i915->base); |
||
214 | draw_install_aapoint_stage(i915->draw, &i915->base); |
||
215 | draw_enable_point_sprites(i915->draw, TRUE); |
||
216 | |||
217 | i915->dirty = ~0; |
||
218 | i915->hardware_dirty = ~0; |
||
219 | i915->immediate_dirty = ~0; |
||
220 | i915->dynamic_dirty = ~0; |
||
221 | i915->static_dirty = ~0; |
||
222 | i915->flush_dirty = 0; |
||
223 | |||
224 | return &i915->base; |
||
225 | }>>>> |