00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "draw/draw_context.h"
00033 #include "pipe/p_defines.h"
00034 #include "pipe/p_inlines.h"
00035 #include "util/u_math.h"
00036 #include "util/u_memory.h"
00037 #include "sp_clear.h"
00038 #include "sp_context.h"
00039 #include "sp_flush.h"
00040 #include "sp_prim_setup.h"
00041 #include "sp_prim_vbuf.h"
00042 #include "sp_state.h"
00043 #include "sp_surface.h"
00044 #include "sp_tile_cache.h"
00045 #include "sp_texture.h"
00046 #include "sp_winsys.h"
00047 #include "sp_query.h"
00048
00049
00050
00054 void
00055 softpipe_map_surfaces(struct softpipe_context *sp)
00056 {
00057 unsigned i;
00058
00059 for (i = 0; i < sp->framebuffer.num_cbufs; i++) {
00060 sp_tile_cache_map_surfaces(sp->cbuf_cache[i]);
00061 }
00062
00063 sp_tile_cache_map_surfaces(sp->zsbuf_cache);
00064 }
00065
00066
00070 void
00071 softpipe_unmap_surfaces(struct softpipe_context *sp)
00072 {
00073 uint i;
00074
00075 for (i = 0; i < sp->framebuffer.num_cbufs; i++)
00076 sp_flush_tile_cache(sp, sp->cbuf_cache[i]);
00077 sp_flush_tile_cache(sp, sp->zsbuf_cache);
00078
00079 for (i = 0; i < sp->framebuffer.num_cbufs; i++) {
00080 sp_tile_cache_unmap_surfaces(sp->cbuf_cache[i]);
00081 }
00082 sp_tile_cache_unmap_surfaces(sp->zsbuf_cache);
00083 }
00084
00085
00086 static void softpipe_destroy( struct pipe_context *pipe )
00087 {
00088 struct softpipe_context *softpipe = softpipe_context( pipe );
00089 struct pipe_winsys *ws = pipe->winsys;
00090 uint i;
00091
00092 if (softpipe->draw)
00093 draw_destroy( softpipe->draw );
00094
00095 for (i = 0; i < SP_NUM_QUAD_THREADS; i++) {
00096 softpipe->quad[i].polygon_stipple->destroy( softpipe->quad[i].polygon_stipple );
00097 softpipe->quad[i].earlyz->destroy( softpipe->quad[i].earlyz );
00098 softpipe->quad[i].shade->destroy( softpipe->quad[i].shade );
00099 softpipe->quad[i].alpha_test->destroy( softpipe->quad[i].alpha_test );
00100 softpipe->quad[i].depth_test->destroy( softpipe->quad[i].depth_test );
00101 softpipe->quad[i].stencil_test->destroy( softpipe->quad[i].stencil_test );
00102 softpipe->quad[i].occlusion->destroy( softpipe->quad[i].occlusion );
00103 softpipe->quad[i].coverage->destroy( softpipe->quad[i].coverage );
00104 softpipe->quad[i].blend->destroy( softpipe->quad[i].blend );
00105 softpipe->quad[i].colormask->destroy( softpipe->quad[i].colormask );
00106 softpipe->quad[i].output->destroy( softpipe->quad[i].output );
00107 }
00108
00109 for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++)
00110 sp_destroy_tile_cache(softpipe->cbuf_cache[i]);
00111 sp_destroy_tile_cache(softpipe->zsbuf_cache);
00112
00113 for (i = 0; i < PIPE_MAX_SAMPLERS; i++)
00114 sp_destroy_tile_cache(softpipe->tex_cache[i]);
00115
00116 for (i = 0; i < Elements(softpipe->constants); i++) {
00117 if (softpipe->constants[i].buffer) {
00118 winsys_buffer_reference(ws, &softpipe->constants[i].buffer, NULL);
00119 }
00120 }
00121
00122 FREE( softpipe );
00123 }
00124
00125
00126 struct pipe_context *
00127 softpipe_create( struct pipe_screen *screen,
00128 struct pipe_winsys *pipe_winsys,
00129 void *unused )
00130 {
00131 struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context);
00132 uint i;
00133
00134 util_init_math();
00135
00136 #ifdef PIPE_ARCH_X86
00137 softpipe->use_sse = !debug_get_bool_option( "GALLIUM_NOSSE", FALSE );
00138 #else
00139 softpipe->use_sse = FALSE;
00140 #endif
00141
00142 softpipe->dump_fs = debug_get_bool_option( "GALLIUM_DUMP_FS", FALSE );
00143
00144 softpipe->pipe.winsys = pipe_winsys;
00145 softpipe->pipe.screen = screen;
00146 softpipe->pipe.destroy = softpipe_destroy;
00147
00148
00149 softpipe->pipe.create_blend_state = softpipe_create_blend_state;
00150 softpipe->pipe.bind_blend_state = softpipe_bind_blend_state;
00151 softpipe->pipe.delete_blend_state = softpipe_delete_blend_state;
00152
00153 softpipe->pipe.create_sampler_state = softpipe_create_sampler_state;
00154 softpipe->pipe.bind_sampler_states = softpipe_bind_sampler_states;
00155 softpipe->pipe.delete_sampler_state = softpipe_delete_sampler_state;
00156
00157 softpipe->pipe.create_depth_stencil_alpha_state = softpipe_create_depth_stencil_state;
00158 softpipe->pipe.bind_depth_stencil_alpha_state = softpipe_bind_depth_stencil_state;
00159 softpipe->pipe.delete_depth_stencil_alpha_state = softpipe_delete_depth_stencil_state;
00160
00161 softpipe->pipe.create_rasterizer_state = softpipe_create_rasterizer_state;
00162 softpipe->pipe.bind_rasterizer_state = softpipe_bind_rasterizer_state;
00163 softpipe->pipe.delete_rasterizer_state = softpipe_delete_rasterizer_state;
00164
00165 softpipe->pipe.create_fs_state = softpipe_create_fs_state;
00166 softpipe->pipe.bind_fs_state = softpipe_bind_fs_state;
00167 softpipe->pipe.delete_fs_state = softpipe_delete_fs_state;
00168
00169 softpipe->pipe.create_vs_state = softpipe_create_vs_state;
00170 softpipe->pipe.bind_vs_state = softpipe_bind_vs_state;
00171 softpipe->pipe.delete_vs_state = softpipe_delete_vs_state;
00172
00173 softpipe->pipe.set_blend_color = softpipe_set_blend_color;
00174 softpipe->pipe.set_clip_state = softpipe_set_clip_state;
00175 softpipe->pipe.set_constant_buffer = softpipe_set_constant_buffer;
00176 softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;
00177 softpipe->pipe.set_polygon_stipple = softpipe_set_polygon_stipple;
00178 softpipe->pipe.set_scissor_state = softpipe_set_scissor_state;
00179 softpipe->pipe.set_sampler_textures = softpipe_set_sampler_textures;
00180 softpipe->pipe.set_viewport_state = softpipe_set_viewport_state;
00181
00182 softpipe->pipe.set_vertex_buffers = softpipe_set_vertex_buffers;
00183 softpipe->pipe.set_vertex_elements = softpipe_set_vertex_elements;
00184
00185 softpipe->pipe.draw_arrays = softpipe_draw_arrays;
00186 softpipe->pipe.draw_elements = softpipe_draw_elements;
00187 softpipe->pipe.draw_range_elements = softpipe_draw_range_elements;
00188 softpipe->pipe.set_edgeflags = softpipe_set_edgeflags;
00189
00190
00191 softpipe->pipe.clear = softpipe_clear;
00192 softpipe->pipe.flush = softpipe_flush;
00193
00194 softpipe_init_query_funcs( softpipe );
00195 softpipe_init_texture_funcs( softpipe );
00196
00197
00198
00199
00200
00201 for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++)
00202 softpipe->cbuf_cache[i] = sp_create_tile_cache( screen );
00203 softpipe->zsbuf_cache = sp_create_tile_cache( screen );
00204
00205 for (i = 0; i < PIPE_MAX_SAMPLERS; i++)
00206 softpipe->tex_cache[i] = sp_create_tile_cache( screen );
00207
00208
00209
00210 for (i = 0; i < SP_NUM_QUAD_THREADS; i++) {
00211 softpipe->quad[i].polygon_stipple = sp_quad_polygon_stipple_stage(softpipe);
00212 softpipe->quad[i].earlyz = sp_quad_earlyz_stage(softpipe);
00213 softpipe->quad[i].shade = sp_quad_shade_stage(softpipe);
00214 softpipe->quad[i].alpha_test = sp_quad_alpha_test_stage(softpipe);
00215 softpipe->quad[i].depth_test = sp_quad_depth_test_stage(softpipe);
00216 softpipe->quad[i].stencil_test = sp_quad_stencil_test_stage(softpipe);
00217 softpipe->quad[i].occlusion = sp_quad_occlusion_stage(softpipe);
00218 softpipe->quad[i].coverage = sp_quad_coverage_stage(softpipe);
00219 softpipe->quad[i].blend = sp_quad_blend_stage(softpipe);
00220 softpipe->quad[i].colormask = sp_quad_colormask_stage(softpipe);
00221 softpipe->quad[i].output = sp_quad_output_stage(softpipe);
00222 }
00223
00224
00225
00226
00227 softpipe->draw = draw_create();
00228 if (!softpipe->draw)
00229 goto fail;
00230
00231 softpipe->setup = sp_draw_render_stage(softpipe);
00232 if (!softpipe->setup)
00233 goto fail;
00234
00235 if (debug_get_bool_option( "SP_NO_RAST", FALSE ))
00236 softpipe->no_rast = TRUE;
00237
00238 if (debug_get_bool_option( "SP_NO_VBUF", FALSE )) {
00239
00240
00241 draw_set_rasterize_stage(softpipe->draw, softpipe->setup);
00242 }
00243 else {
00244 sp_init_vbuf(softpipe);
00245 }
00246
00247
00248 draw_install_aaline_stage(softpipe->draw, &softpipe->pipe);
00249 draw_install_aapoint_stage(softpipe->draw, &softpipe->pipe);
00250
00251 #if USE_DRAW_STAGE_PSTIPPLE
00252
00253 draw_install_pstipple_stage(softpipe->draw, &softpipe->pipe);
00254 #endif
00255
00256 sp_init_surface_functions(softpipe);
00257
00258 return &softpipe->pipe;
00259
00260 fail:
00261 softpipe_destroy(&softpipe->pipe);
00262 return NULL;
00263 }
00264