diff options
Diffstat (limited to 'src/gallium/drivers/softpipe')
36 files changed, 1099 insertions, 1545 deletions
| diff --git a/src/gallium/drivers/softpipe/Makefile b/src/gallium/drivers/softpipe/Makefile index e4ac49fa85..83f3e4a19b 100644 --- a/src/gallium/drivers/softpipe/Makefile +++ b/src/gallium/drivers/softpipe/Makefile @@ -7,6 +7,7 @@ C_SOURCES = \  	sp_fs_exec.c \  	sp_fs_sse.c \  	sp_clear.c \ +	sp_fence.c \  	sp_flush.c \  	sp_query.c \  	sp_context.c \ @@ -31,8 +32,6 @@ C_SOURCES = \  	sp_tex_sample.c \  	sp_tex_tile_cache.c \  	sp_tile_cache.c \ -	sp_surface.c \ -	sp_video_context.c \ -	sp_winsys.c +	sp_surface.c  include ../../Makefile.template diff --git a/src/gallium/drivers/softpipe/SConscript b/src/gallium/drivers/softpipe/SConscript index 3042e556c6..b80c6dea93 100644 --- a/src/gallium/drivers/softpipe/SConscript +++ b/src/gallium/drivers/softpipe/SConscript @@ -10,6 +10,7 @@ softpipe = env.ConvenienceLibrary(  		'sp_clear.c',  		'sp_context.c',  		'sp_draw_arrays.c', +		'sp_fence.c',  		'sp_flush.c',  		'sp_prim_vbuf.c',  		'sp_setup.c', @@ -33,8 +34,6 @@ softpipe = env.ConvenienceLibrary(  		'sp_tex_tile_cache.c',  		'sp_texture.c',  		'sp_tile_cache.c', -		'sp_video_context.c', -		'sp_winsys.c'  	])  Export('softpipe') diff --git a/src/gallium/drivers/softpipe/sp_clear.c b/src/gallium/drivers/softpipe/sp_clear.c index 5f130453c3..ae3f00f338 100644 --- a/src/gallium/drivers/softpipe/sp_clear.c +++ b/src/gallium/drivers/softpipe/sp_clear.c @@ -69,11 +69,6 @@ softpipe_clear(struct pipe_context *pipe, unsigned buffers, const float *rgba,           util_pack_color(rgba, ps->format, &uc);           sp_tile_cache_clear(softpipe->cbuf_cache[i], rgba, uc.ui); - -#if !TILE_CLEAR_OPTIMIZATION -         /* non-cached surface */ -         pipe->surface_fill(pipe, ps, 0, 0, ps->width, ps->height, uc.ui); -#endif        }     } @@ -83,11 +78,6 @@ softpipe_clear(struct pipe_context *pipe, unsigned buffers, const float *rgba,        cv = util_pack_z_stencil(ps->format, depth, stencil);        sp_tile_cache_clear(softpipe->zsbuf_cache, zero, cv); - -#if !TILE_CLEAR_OPTIMIZATION -      /* non-cached surface */ -      pipe->surface_fill(pipe, ps, 0, 0, ps->width, ps->height, cv); -#endif     }     softpipe->dirty_render_cache = TRUE; diff --git a/src/gallium/drivers/softpipe/sp_context.c b/src/gallium/drivers/softpipe/sp_context.c index 7c7abc9eb2..f6e2b80d46 100644 --- a/src/gallium/drivers/softpipe/sp_context.c +++ b/src/gallium/drivers/softpipe/sp_context.c @@ -44,6 +44,7 @@  #include "sp_surface.h"  #include "sp_tile_cache.h"  #include "sp_tex_tile_cache.h" +#include "sp_texture.h"  #include "sp_query.h" @@ -92,6 +93,7 @@ softpipe_destroy( struct pipe_context *pipe )     softpipe->quad.shade->destroy( softpipe->quad.shade );     softpipe->quad.depth_test->destroy( softpipe->quad.depth_test );     softpipe->quad.blend->destroy( softpipe->quad.blend ); +   softpipe->quad.pstipple->destroy( softpipe->quad.pstipple );     for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {        sp_destroy_tile_cache(softpipe->cbuf_cache[i]); @@ -103,12 +105,12 @@ softpipe_destroy( struct pipe_context *pipe )     for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {        sp_destroy_tex_tile_cache(softpipe->tex_cache[i]); -      pipe_texture_reference(&softpipe->texture[i], NULL); +      pipe_sampler_view_reference(&softpipe->sampler_views[i], NULL);     }     for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) {        sp_destroy_tex_tile_cache(softpipe->vertex_tex_cache[i]); -      pipe_texture_reference(&softpipe->vertex_textures[i], NULL); +      pipe_sampler_view_reference(&softpipe->vertex_sampler_views[i], NULL);     }     for (i = 0; i < PIPE_SHADER_TYPES; i++) { @@ -116,7 +118,7 @@ softpipe_destroy( struct pipe_context *pipe )        for (j = 0; j < PIPE_MAX_CONSTANT_BUFFERS; j++) {           if (softpipe->constants[i][j]) { -            pipe_buffer_reference(&softpipe->constants[i][j], NULL); +            pipe_resource_reference(&softpipe->constants[i][j], NULL);           }        }     } @@ -134,13 +136,16 @@ softpipe_destroy( struct pipe_context *pipe )   *    return PIPE_UNREFERENCED   */  static unsigned int -softpipe_is_texture_referenced( struct pipe_context *pipe, -				struct pipe_texture *texture, +softpipe_is_resource_referenced( struct pipe_context *pipe, +				struct pipe_resource *texture,  				unsigned face, unsigned level)  {     struct softpipe_context *softpipe = softpipe_context( pipe );     unsigned i; +   if (texture->target == PIPE_BUFFER) +      return PIPE_UNREFERENCED; +        /* check if any of the bound drawing surfaces are this texture */     if (softpipe->dirty_render_cache) {        for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) { @@ -171,12 +176,6 @@ softpipe_is_texture_referenced( struct pipe_context *pipe,  } -static unsigned int -softpipe_is_buffer_referenced( struct pipe_context *pipe, -			       struct pipe_buffer *buf) -{ -   return PIPE_UNREFERENCED; -}  static void @@ -210,7 +209,7 @@ softpipe_create_context( struct pipe_screen *screen,     softpipe->dump_fs = debug_get_bool_option( "GALLIUM_DUMP_FS", FALSE );     softpipe->dump_gs = debug_get_bool_option( "SOFTPIPE_DUMP_GS", FALSE ); -   softpipe->pipe.winsys = screen->winsys; +   softpipe->pipe.winsys = NULL;     softpipe->pipe.screen = screen;     softpipe->pipe.destroy = softpipe_destroy;     softpipe->pipe.priv = priv; @@ -245,6 +244,10 @@ softpipe_create_context( struct pipe_screen *screen,     softpipe->pipe.bind_gs_state   = softpipe_bind_gs_state;     softpipe->pipe.delete_gs_state = softpipe_delete_gs_state; +   softpipe->pipe.create_vertex_elements_state = softpipe_create_vertex_elements_state; +   softpipe->pipe.bind_vertex_elements_state = softpipe_bind_vertex_elements_state; +   softpipe->pipe.delete_vertex_elements_state = softpipe_delete_vertex_elements_state; +     softpipe->pipe.set_blend_color = softpipe_set_blend_color;     softpipe->pipe.set_stencil_ref = softpipe_set_stencil_ref;     softpipe->pipe.set_clip_state = softpipe_set_clip_state; @@ -252,12 +255,13 @@ softpipe_create_context( struct pipe_screen *screen,     softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;     softpipe->pipe.set_polygon_stipple = softpipe_set_polygon_stipple;     softpipe->pipe.set_scissor_state = softpipe_set_scissor_state; -   softpipe->pipe.set_fragment_sampler_textures = softpipe_set_sampler_textures; -   softpipe->pipe.set_vertex_sampler_textures = softpipe_set_vertex_sampler_textures; +   softpipe->pipe.set_fragment_sampler_views = softpipe_set_sampler_views; +   softpipe->pipe.set_vertex_sampler_views = softpipe_set_vertex_sampler_views; +   softpipe->pipe.create_sampler_view = softpipe_create_sampler_view; +   softpipe->pipe.sampler_view_destroy = softpipe_sampler_view_destroy;     softpipe->pipe.set_viewport_state = softpipe_set_viewport_state;     softpipe->pipe.set_vertex_buffers = softpipe_set_vertex_buffers; -   softpipe->pipe.set_vertex_elements = softpipe_set_vertex_elements;     softpipe->pipe.draw_arrays = softpipe_draw_arrays;     softpipe->pipe.draw_elements = softpipe_draw_elements; @@ -268,10 +272,10 @@ softpipe_create_context( struct pipe_screen *screen,     softpipe->pipe.clear = softpipe_clear;     softpipe->pipe.flush = softpipe_flush; -   softpipe->pipe.is_texture_referenced = softpipe_is_texture_referenced; -   softpipe->pipe.is_buffer_referenced = softpipe_is_buffer_referenced; +   softpipe->pipe.is_resource_referenced = softpipe_is_resource_referenced;     softpipe_init_query_funcs( softpipe ); +   softpipe_init_texture_funcs( &softpipe->pipe );     softpipe->pipe.render_condition = softpipe_render_condition; @@ -280,19 +284,20 @@ softpipe_create_context( struct pipe_screen *screen,      * Must be before quad stage setup!      */     for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) -      softpipe->cbuf_cache[i] = sp_create_tile_cache( screen ); -   softpipe->zsbuf_cache = sp_create_tile_cache( screen ); +      softpipe->cbuf_cache[i] = sp_create_tile_cache( &softpipe->pipe ); +   softpipe->zsbuf_cache = sp_create_tile_cache( &softpipe->pipe );     for (i = 0; i < PIPE_MAX_SAMPLERS; i++) -      softpipe->tex_cache[i] = sp_create_tex_tile_cache( screen ); +      softpipe->tex_cache[i] = sp_create_tex_tile_cache( &softpipe->pipe );     for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) { -      softpipe->vertex_tex_cache[i] = sp_create_tex_tile_cache(screen); +      softpipe->vertex_tex_cache[i] = sp_create_tex_tile_cache( &softpipe->pipe );     }     /* setup quad rendering stages */     softpipe->quad.shade = sp_quad_shade_stage(softpipe);     softpipe->quad.depth_test = sp_quad_depth_test_stage(softpipe);     softpipe->quad.blend = sp_quad_blend_stage(softpipe); +   softpipe->quad.pstipple = sp_quad_polygon_stipple_stage(softpipe);     /* @@ -327,7 +332,11 @@ softpipe_create_context( struct pipe_screen *screen,     draw_install_aapoint_stage(softpipe->draw, &softpipe->pipe);     /* Do polygon stipple w/ texture map + frag prog? */ +#if DO_PSTIPPLE_IN_DRAW_MODULE     draw_install_pstipple_stage(softpipe->draw, &softpipe->pipe); +#endif + +   draw_wide_point_sprites(softpipe->draw, TRUE);     sp_init_surface_functions(softpipe); diff --git a/src/gallium/drivers/softpipe/sp_context.h b/src/gallium/drivers/softpipe/sp_context.h index 95def72c54..92607874b6 100644 --- a/src/gallium/drivers/softpipe/sp_context.h +++ b/src/gallium/drivers/softpipe/sp_context.h @@ -38,6 +38,10 @@  #include "sp_quad_pipe.h" +/** Do polygon stipple in the driver here, or in the draw module? */ +#define DO_PSTIPPLE_IN_DRAW_MODULE 1 + +  struct softpipe_vbuf_render;  struct draw_context;  struct draw_stage; @@ -45,6 +49,7 @@ struct softpipe_tile_cache;  struct softpipe_tex_tile_cache;  struct sp_fragment_shader;  struct sp_vertex_shader; +struct sp_velems_state;  struct softpipe_context { @@ -59,26 +64,25 @@ struct softpipe_context {     struct sp_fragment_shader *fs;     struct sp_vertex_shader *vs;     struct sp_geometry_shader *gs; +   struct sp_velems_state *velems;     /** Other rendering state */     struct pipe_blend_color blend_color;     struct pipe_stencil_ref stencil_ref;     struct pipe_clip_state clip; -   struct pipe_buffer *constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS]; +   struct pipe_resource *constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];     struct pipe_framebuffer_state framebuffer;     struct pipe_poly_stipple poly_stipple;     struct pipe_scissor_state scissor; -   struct pipe_texture *texture[PIPE_MAX_SAMPLERS]; -   struct pipe_texture *vertex_textures[PIPE_MAX_VERTEX_SAMPLERS]; +   struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS]; +   struct pipe_sampler_view *vertex_sampler_views[PIPE_MAX_VERTEX_SAMPLERS];     struct pipe_viewport_state viewport;     struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS]; -   struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];     unsigned num_samplers; -   unsigned num_textures; +   unsigned num_sampler_views;     unsigned num_vertex_samplers; -   unsigned num_vertex_textures; -   unsigned num_vertex_elements; +   unsigned num_vertex_sampler_views;     unsigned num_vertex_buffers;     unsigned dirty; /**< Mask of SP_NEW_x flags */ @@ -93,7 +97,7 @@ struct softpipe_context {     ubyte *mapped_vbuffer[PIPE_MAX_ATTRIBS];     /** Mapped constant buffers */ -   void *mapped_constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS]; +   const void *mapped_constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];     /** Vertex format */     struct vertex_info vertex_info; @@ -126,6 +130,7 @@ struct softpipe_context {        struct quad_stage *shade;        struct quad_stage *depth_test;        struct quad_stage *blend; +      struct quad_stage *pstipple;        struct quad_stage *first; /**< points to one of the above stages */     } quad; diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c b/src/gallium/drivers/softpipe/sp_draw_arrays.c index b2acc36bf7..b30036e230 100644 --- a/src/gallium/drivers/softpipe/sp_draw_arrays.c +++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c @@ -33,90 +33,19 @@  #include "pipe/p_defines.h"  #include "pipe/p_context.h" -#include "util/u_simple_screen.h"  #include "util/u_inlines.h"  #include "util/u_prim.h"  #include "sp_context.h"  #include "sp_query.h"  #include "sp_state.h" +#include "sp_texture.h"  #include "draw/draw_context.h" -static void -softpipe_map_constant_buffers(struct softpipe_context *sp) -{ -   struct pipe_winsys *ws = sp->pipe.winsys; -   uint i; - -   for (i = 0; i < PIPE_SHADER_TYPES; i++) { -      uint j; - -      for (j = 0; j < PIPE_MAX_CONSTANT_BUFFERS; j++) { -         if (sp->constants[i][j] && sp->constants[i][j]->size) { -            sp->mapped_constants[i][j] = ws->buffer_map(ws, -                                                        sp->constants[i][j], -                                                        PIPE_BUFFER_USAGE_CPU_READ); -         } -      } -   } - -   for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; i++) { -      if (sp->constants[PIPE_SHADER_VERTEX][i]) { -         draw_set_mapped_constant_buffer(sp->draw, -                                         PIPE_SHADER_VERTEX, -                                         i, -                                         sp->mapped_constants[PIPE_SHADER_VERTEX][i], -                                         sp->constants[PIPE_SHADER_VERTEX][i]->size); -      } -      if (sp->constants[PIPE_SHADER_GEOMETRY][i]) { -         draw_set_mapped_constant_buffer(sp->draw, -                                         PIPE_SHADER_GEOMETRY, -                                         i, -                                         sp->mapped_constants[PIPE_SHADER_GEOMETRY][i], -                                         sp->constants[PIPE_SHADER_GEOMETRY][i]->size); -      } -   } -} - - -static void -softpipe_unmap_constant_buffers(struct softpipe_context *sp) -{ -   struct pipe_winsys *ws = sp->pipe.winsys; -   uint i; - -   /* really need to flush all prims since the vert/frag shaders const buffers -    * are going away now. -    */ -   draw_flush(sp->draw); -   for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; i++) { -      draw_set_mapped_constant_buffer(sp->draw, -                                      PIPE_SHADER_VERTEX, -                                      i, -                                      NULL, -                                      0); -      draw_set_mapped_constant_buffer(sp->draw, -                                      PIPE_SHADER_GEOMETRY, -                                      i, -                                      NULL, -                                      0); -   } - -   for (i = 0; i < PIPE_SHADER_TYPES; i++) { -      uint j; - -      for (j = 0; j < PIPE_MAX_CONSTANT_BUFFERS; j++) { -         if (sp->constants[i][j] && sp->constants[i][j]->size) { -            ws->buffer_unmap(ws, sp->constants[i][j]); -         } -         sp->mapped_constants[i][j] = NULL; -      } -   } -}  /** @@ -126,8 +55,9 @@ softpipe_unmap_constant_buffers(struct softpipe_context *sp)   */  static void  softpipe_draw_range_elements_instanced(struct pipe_context *pipe, -                                       struct pipe_buffer *indexBuffer, +                                       struct pipe_resource *indexBuffer,                                         unsigned indexSize, +                                       int indexBias,                                         unsigned minIndex,                                         unsigned maxIndex,                                         unsigned mode, @@ -145,6 +75,7 @@ softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,                                            NULL,                                            0,                                            0, +                                          0,                                            0xffffffff,                                            mode,                                            start, @@ -156,8 +87,9 @@ softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,  void  softpipe_draw_range_elements(struct pipe_context *pipe, -                             struct pipe_buffer *indexBuffer, +                             struct pipe_resource *indexBuffer,                               unsigned indexSize, +                             int indexBias,                               unsigned min_index,                               unsigned max_index,                               unsigned mode, unsigned start, unsigned count) @@ -165,6 +97,7 @@ softpipe_draw_range_elements(struct pipe_context *pipe,     softpipe_draw_range_elements_instanced(pipe,                                            indexBuffer,                                            indexSize, +                                          indexBias,                                            min_index,                                            max_index,                                            mode, @@ -177,13 +110,14 @@ softpipe_draw_range_elements(struct pipe_context *pipe,  void  softpipe_draw_elements(struct pipe_context *pipe, -                       struct pipe_buffer *indexBuffer, -                       unsigned indexSize, +                       struct pipe_resource *indexBuffer, +                       unsigned indexSize, int indexBias,                         unsigned mode, unsigned start, unsigned count)  {     softpipe_draw_range_elements_instanced(pipe,                                            indexBuffer,                                            indexSize, +                                          indexBias,                                            0,                                            0xffffffff,                                            mode, @@ -205,6 +139,7 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,                                            NULL,                                            0,                                            0, +                                          0,                                            0xffffffff,                                            mode,                                            start, @@ -215,8 +150,9 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,  void  softpipe_draw_elements_instanced(struct pipe_context *pipe, -                                 struct pipe_buffer *indexBuffer, +                                 struct pipe_resource *indexBuffer,                                   unsigned indexSize, +                                 int indexBias,                                   unsigned mode,                                   unsigned start,                                   unsigned count, @@ -226,6 +162,7 @@ softpipe_draw_elements_instanced(struct pipe_context *pipe,     softpipe_draw_range_elements_instanced(pipe,                                            indexBuffer,                                            indexSize, +                                          indexBias,                                            0,                                            0xffffffff,                                            mode, @@ -237,8 +174,9 @@ softpipe_draw_elements_instanced(struct pipe_context *pipe,  static void  softpipe_draw_range_elements_instanced(struct pipe_context *pipe, -                                       struct pipe_buffer *indexBuffer, +                                       struct pipe_resource *indexBuffer,                                         unsigned indexSize, +                                       int indexBias,                                         unsigned minIndex,                                         unsigned maxIndex,                                         unsigned mode, @@ -261,34 +199,26 @@ softpipe_draw_range_elements_instanced(struct pipe_context *pipe,     }     softpipe_map_transfers(sp); -   softpipe_map_constant_buffers(sp);     /* Map vertex buffers */     for (i = 0; i < sp->num_vertex_buffers; i++) { -      void *buf; - -      buf = pipe_buffer_map(pipe->screen, -                            sp->vertex_buffer[i].buffer, -                            PIPE_BUFFER_USAGE_CPU_READ); +      void *buf = softpipe_resource(sp->vertex_buffer[i].buffer)->data;        draw_set_mapped_vertex_buffer(draw, i, buf);     }     /* Map index buffer, if present */     if (indexBuffer) { -      void *mapped_indexes; - -      mapped_indexes = pipe_buffer_map(pipe->screen, -                                       indexBuffer, -                                       PIPE_BUFFER_USAGE_CPU_READ); +      void *mapped_indexes = softpipe_resource(indexBuffer)->data;        draw_set_mapped_element_buffer_range(draw,                                             indexSize, +                                           indexBias,                                             minIndex,                                             maxIndex,                                             mapped_indexes);     } else {        /* no index/element buffer */        draw_set_mapped_element_buffer_range(draw, -                                           0, +                                           0, 0,                                             start,                                             start + count - 1,                                             NULL); @@ -300,15 +230,18 @@ softpipe_draw_range_elements_instanced(struct pipe_context *pipe,     /* unmap vertex/index buffers - will cause draw module to flush */     for (i = 0; i < sp->num_vertex_buffers; i++) {        draw_set_mapped_vertex_buffer(draw, i, NULL); -      pipe_buffer_unmap(pipe->screen, sp->vertex_buffer[i].buffer);     }     if (indexBuffer) { -      draw_set_mapped_element_buffer(draw, 0, NULL); -      pipe_buffer_unmap(pipe->screen, indexBuffer); +      draw_set_mapped_element_buffer(draw, 0, 0, NULL);     } -   /* Note: leave drawing surfaces mapped */ -   softpipe_unmap_constant_buffers(sp); +   /* +    * TODO: Flush only when a user vertex/index buffer is present +    * (or even better, modify draw module to do this +    * internally when this condition is seen?) +    */ +   draw_flush(draw); +   /* Note: leave drawing surfaces mapped */     sp->dirty_render_cache = TRUE;  } diff --git a/src/gallium/drivers/softpipe/sp_fence.c b/src/gallium/drivers/softpipe/sp_fence.c new file mode 100644 index 0000000000..66c5214113 --- /dev/null +++ b/src/gallium/drivers/softpipe/sp_fence.c @@ -0,0 +1,70 @@ +/************************************************************************** + * + * Copyright 2010 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + **************************************************************************/ + + +#include "pipe/p_screen.h" +#include "util/u_debug.h" +#include "sp_fence.h" + + +static void +softpipe_fence_reference(struct pipe_screen *screen, +                         struct pipe_fence_handle **ptr, +                         struct pipe_fence_handle *fence) +{ +   assert(!*ptr); +   assert(!fence); +} + + +static int +softpipe_fence_signalled(struct pipe_screen *screen, +                         struct pipe_fence_handle *fence, +                         unsigned flags) +{ +   assert(!fence); +   return 0; +} + + +static int +softpipe_fence_finish(struct pipe_screen *screen, +                      struct pipe_fence_handle *fence, +                      unsigned flags) +{ +   assert(!fence); +   return 0; +} + + +void +softpipe_init_screen_fence_funcs(struct pipe_screen *screen) +{ +   screen->fence_reference = softpipe_fence_reference; +   screen->fence_finish = softpipe_fence_finish; +   screen->fence_signalled = softpipe_fence_signalled; +} diff --git a/src/gallium/drivers/softpipe/sp_fence.h b/src/gallium/drivers/softpipe/sp_fence.h new file mode 100644 index 0000000000..39c33243bd --- /dev/null +++ b/src/gallium/drivers/softpipe/sp_fence.h @@ -0,0 +1,40 @@ +/************************************************************************** + * + * Copyright 2010 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + **************************************************************************/ + + +#ifndef SP_FENCE_H_ +#define SP_FENCE_H_ + + +struct pipe_screen; + + +void +softpipe_init_screen_fence_funcs(struct pipe_screen *screen); + + +#endif /* SP_FENCE_H_ */ diff --git a/src/gallium/drivers/softpipe/sp_flush.c b/src/gallium/drivers/softpipe/sp_flush.c index e8952bf4fb..5024fc8a81 100644 --- a/src/gallium/drivers/softpipe/sp_flush.c +++ b/src/gallium/drivers/softpipe/sp_flush.c @@ -50,10 +50,10 @@ softpipe_flush( struct pipe_context *pipe,     draw_flush(softpipe->draw);     if (flags & PIPE_FLUSH_TEXTURE_CACHE) { -      for (i = 0; i < softpipe->num_textures; i++) { +      for (i = 0; i < softpipe->num_sampler_views; i++) {           sp_flush_tex_tile_cache(softpipe->tex_cache[i]);        } -      for (i = 0; i < softpipe->num_vertex_textures; i++) { +      for (i = 0; i < softpipe->num_vertex_sampler_views; i++) {           sp_flush_tex_tile_cache(softpipe->vertex_tex_cache[i]);        }     } @@ -93,9 +93,9 @@ softpipe_flush( struct pipe_context *pipe,        static unsigned frame_no = 1;        static char filename[256];        util_snprintf(filename, sizeof(filename), "cbuf_%u.bmp", frame_no); -      debug_dump_surface_bmp(filename, softpipe->framebuffer.cbufs[0]); +      debug_dump_surface_bmp(softpipe, filename, softpipe->framebuffer.cbufs[0]);        util_snprintf(filename, sizeof(filename), "zsbuf_%u.bmp", frame_no); -      debug_dump_surface_bmp(filename, softpipe->framebuffer.zsbuf); +      debug_dump_surface_bmp(softpipe, filename, softpipe->framebuffer.zsbuf);        ++frame_no;     }  #endif @@ -104,3 +104,71 @@ softpipe_flush( struct pipe_context *pipe,        *fence = NULL;  } + +/** + * Flush context if necessary. + * + * Returns FALSE if it would have block, but do_not_block was set, TRUE + * otherwise. + * + * TODO: move this logic to an auxiliary library? + */ +boolean +softpipe_flush_resource(struct pipe_context *pipe, +                        struct pipe_resource *texture, +                        unsigned face, +                        unsigned level, +                        unsigned flush_flags, +                        boolean read_only, +                        boolean cpu_access, +                        boolean do_not_block) +{ +   unsigned referenced; + +   referenced = pipe->is_resource_referenced(pipe, texture, face, level); + +   if ((referenced & PIPE_REFERENCED_FOR_WRITE) || +       ((referenced & PIPE_REFERENCED_FOR_READ) && !read_only)) { + +      /* +       * TODO: The semantics of these flush flags are too obtuse. They should +       * disappear and the pipe driver should just ensure that all visible +       * side-effects happen when they need to happen. +       */ +      if (referenced & PIPE_REFERENCED_FOR_WRITE) +         flush_flags |= PIPE_FLUSH_RENDER_CACHE; + +      if (referenced & PIPE_REFERENCED_FOR_READ) +         flush_flags |= PIPE_FLUSH_TEXTURE_CACHE; + +      if (cpu_access) { +         /* +          * Flush and wait. +          */ + +         struct pipe_fence_handle *fence = NULL; + +         if (do_not_block) +            return FALSE; + +         pipe->flush(pipe, flush_flags, &fence); + +         if (fence) { +            /* +             * This is for illustrative purposes only, as softpipe does not +             * have fences. +             */ +            pipe->screen->fence_finish(pipe->screen, fence, 0); +            pipe->screen->fence_reference(pipe->screen, &fence, NULL); +         } +      } else { +         /* +          * Just flush. +          */ + +         pipe->flush(pipe, flush_flags, NULL); +      } +   } + +   return TRUE; +} diff --git a/src/gallium/drivers/softpipe/sp_flush.h b/src/gallium/drivers/softpipe/sp_flush.h index 68d9b5fa83..cb97482a71 100644 --- a/src/gallium/drivers/softpipe/sp_flush.h +++ b/src/gallium/drivers/softpipe/sp_flush.h @@ -28,10 +28,23 @@  #ifndef SP_FLUSH_H  #define SP_FLUSH_H +#include "pipe/p_compiler.h" +  struct pipe_context;  struct pipe_fence_handle; -void softpipe_flush(struct pipe_context *pipe, unsigned flags, -                    struct pipe_fence_handle **fence); +void +softpipe_flush(struct pipe_context *pipe, unsigned flags, +               struct pipe_fence_handle **fence); + +boolean +softpipe_flush_resource(struct pipe_context *pipe, +                        struct pipe_resource *texture, +                        unsigned face, +                        unsigned level, +                        unsigned flush_flags, +                        boolean read_only, +                        boolean cpu_access, +                        boolean do_not_block);  #endif diff --git a/src/gallium/drivers/softpipe/sp_fs_exec.c b/src/gallium/drivers/softpipe/sp_fs_exec.c index 27fa126b7c..67e2c8f8bc 100644 --- a/src/gallium/drivers/softpipe/sp_fs_exec.c +++ b/src/gallium/drivers/softpipe/sp_fs_exec.c @@ -145,8 +145,13 @@ exec_run( const struct sp_fragment_shader *base,           case TGSI_SEMANTIC_COLOR:              {                 uint cbuf = sem_index[i]; + +               assert(sizeof(quad->output.color[cbuf]) == +                      sizeof(machine->Outputs[i])); + +               /* copy float[4][4] result */                 memcpy(quad->output.color[cbuf], -                      &machine->Outputs[i].xyzw[0].f[0], +                      &machine->Outputs[i],                        sizeof(quad->output.color[0]) );              }              break; diff --git a/src/gallium/drivers/softpipe/sp_fs_sse.c b/src/gallium/drivers/softpipe/sp_fs_sse.c index acee213670..daa158df7c 100644 --- a/src/gallium/drivers/softpipe/sp_fs_sse.c +++ b/src/gallium/drivers/softpipe/sp_fs_sse.c @@ -156,8 +156,13 @@ fs_sse_run( const struct sp_fragment_shader *base,           case TGSI_SEMANTIC_COLOR:              {                 uint cbuf = sem_index[i]; + +               assert(sizeof(quad->output.color[cbuf]) == +                      sizeof(machine->Outputs[i])); + +               /* copy float[4][4] result */                 memcpy(quad->output.color[cbuf], -                      &machine->Outputs[i].xyzw[0].f[0], +                      &machine->Outputs[i],                        sizeof(quad->output.color[0]) );              }              break; diff --git a/src/gallium/drivers/softpipe/sp_prim_vbuf.c b/src/gallium/drivers/softpipe/sp_prim_vbuf.c index 98c08eaffa..a58bc107c0 100644 --- a/src/gallium/drivers/softpipe/sp_prim_vbuf.c +++ b/src/gallium/drivers/softpipe/sp_prim_vbuf.c @@ -76,11 +76,7 @@ softpipe_vbuf_render(struct vbuf_render *vbr)  } - - - - - +/** This tells the draw module about our desired vertex layout */  static const struct vertex_info *  sp_vbuf_get_vertex_info(struct vbuf_render *vbr)  { @@ -108,12 +104,14 @@ sp_vbuf_allocate_vertices(struct vbuf_render *vbr,     return cvbr->vertex_buffer != NULL;  } +  static void  sp_vbuf_release_vertices(struct vbuf_render *vbr)  {     /* keep the old allocation for next time */  } +  static void *  sp_vbuf_map_vertices(struct vbuf_render *vbr)  { @@ -121,6 +119,7 @@ sp_vbuf_map_vertices(struct vbuf_render *vbr)     return cvbr->vertex_buffer;  } +  static void   sp_vbuf_unmap_vertices(struct vbuf_render *vbr,                          ushort min_index, @@ -144,7 +143,6 @@ sp_vbuf_set_primitive(struct vbuf_render *vbr, unsigned prim)     cvbr->softpipe->reduced_prim = u_reduced_prim(prim);     cvbr->prim = prim;     return TRUE; -  } @@ -173,36 +171,36 @@ sp_vbuf_draw(struct vbuf_render *vbr, const ushort *indices, uint nr)     case PIPE_PRIM_POINTS:        for (i = 0; i < nr; i++) {           sp_setup_point( setup_ctx, -                      get_vert(vertex_buffer, indices[i-0], stride) ); +                         get_vert(vertex_buffer, indices[i-0], stride) );        }        break;     case PIPE_PRIM_LINES:        for (i = 1; i < nr; i += 2) {           sp_setup_line( setup_ctx, -                     get_vert(vertex_buffer, indices[i-1], stride), -                     get_vert(vertex_buffer, indices[i-0], stride) ); +                        get_vert(vertex_buffer, indices[i-1], stride), +                        get_vert(vertex_buffer, indices[i-0], stride) );        }        break;     case PIPE_PRIM_LINE_STRIP:        for (i = 1; i < nr; i ++) {           sp_setup_line( setup_ctx, -                     get_vert(vertex_buffer, indices[i-1], stride), -                     get_vert(vertex_buffer, indices[i-0], stride) ); +                        get_vert(vertex_buffer, indices[i-1], stride), +                        get_vert(vertex_buffer, indices[i-0], stride) );        }        break;     case PIPE_PRIM_LINE_LOOP:        for (i = 1; i < nr; i ++) {           sp_setup_line( setup_ctx, -                     get_vert(vertex_buffer, indices[i-1], stride), -                     get_vert(vertex_buffer, indices[i-0], stride) ); +                        get_vert(vertex_buffer, indices[i-1], stride), +                        get_vert(vertex_buffer, indices[i-0], stride) );        }        if (nr) {           sp_setup_line( setup_ctx, -                     get_vert(vertex_buffer, indices[nr-1], stride), -                     get_vert(vertex_buffer, indices[0], stride) ); +                        get_vert(vertex_buffer, indices[nr-1], stride), +                        get_vert(vertex_buffer, indices[0], stride) );        }        break; @@ -210,17 +208,17 @@ sp_vbuf_draw(struct vbuf_render *vbr, const ushort *indices, uint nr)        if (softpipe->rasterizer->flatshade_first) {           for (i = 2; i < nr; i += 3) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[i-1], stride), -                       get_vert(vertex_buffer, indices[i-0], stride), -                       get_vert(vertex_buffer, indices[i-2], stride) ); +                          get_vert(vertex_buffer, indices[i-1], stride), +                          get_vert(vertex_buffer, indices[i-0], stride), +                          get_vert(vertex_buffer, indices[i-2], stride) );           }        }        else {           for (i = 2; i < nr; i += 3) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[i-2], stride), -                       get_vert(vertex_buffer, indices[i-1], stride), -                       get_vert(vertex_buffer, indices[i-0], stride) ); +                          get_vert(vertex_buffer, indices[i-2], stride), +                          get_vert(vertex_buffer, indices[i-1], stride), +                          get_vert(vertex_buffer, indices[i-0], stride) );           }        }        break; @@ -229,17 +227,17 @@ sp_vbuf_draw(struct vbuf_render *vbr, const ushort *indices, uint nr)        if (softpipe->rasterizer->flatshade_first) {           for (i = 2; i < nr; i += 1) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[i+(i&1)-1], stride), -                       get_vert(vertex_buffer, indices[i-(i&1)], stride), -                       get_vert(vertex_buffer, indices[i-2], stride) ); +                          get_vert(vertex_buffer, indices[i+(i&1)-1], stride), +                          get_vert(vertex_buffer, indices[i-(i&1)], stride), +                          get_vert(vertex_buffer, indices[i-2], stride) );           }        }        else {           for (i = 2; i < nr; i += 1) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[i+(i&1)-2], stride), -                       get_vert(vertex_buffer, indices[i-(i&1)-1], stride), -                       get_vert(vertex_buffer, indices[i-0], stride) ); +                          get_vert(vertex_buffer, indices[i+(i&1)-2], stride), +                          get_vert(vertex_buffer, indices[i-(i&1)-1], stride), +                          get_vert(vertex_buffer, indices[i-0], stride) );           }        }        break; @@ -248,73 +246,45 @@ sp_vbuf_draw(struct vbuf_render *vbr, const ushort *indices, uint nr)        if (softpipe->rasterizer->flatshade_first) {           for (i = 2; i < nr; i += 1) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[i-0], stride), -                       get_vert(vertex_buffer, indices[0], stride), -                       get_vert(vertex_buffer, indices[i-1], stride) ); +                          get_vert(vertex_buffer, indices[i-0], stride), +                          get_vert(vertex_buffer, indices[0], stride), +                          get_vert(vertex_buffer, indices[i-1], stride) );           }        }        else {           for (i = 2; i < nr; i += 1) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[0], stride), -                       get_vert(vertex_buffer, indices[i-1], stride), -                       get_vert(vertex_buffer, indices[i-0], stride) ); +                          get_vert(vertex_buffer, indices[0], stride), +                          get_vert(vertex_buffer, indices[i-1], stride), +                          get_vert(vertex_buffer, indices[i-0], stride) );           }        }        break;     case PIPE_PRIM_QUADS: -      if (softpipe->rasterizer->flatshade_first) { -         for (i = 3; i < nr; i += 4) { -            sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[i-2], stride), -                       get_vert(vertex_buffer, indices[i-1], stride), -                       get_vert(vertex_buffer, indices[i-3], stride) ); -            sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[i-1], stride), -                       get_vert(vertex_buffer, indices[i-0], stride), -                       get_vert(vertex_buffer, indices[i-3], stride) ); -         } -      } -      else { -         for (i = 3; i < nr; i += 4) { -            sp_setup_tri( setup_ctx, +      for (i = 3; i < nr; i += 4) { +         sp_setup_tri( setup_ctx,                         get_vert(vertex_buffer, indices[i-3], stride),                         get_vert(vertex_buffer, indices[i-2], stride),                         get_vert(vertex_buffer, indices[i-0], stride) ); -            sp_setup_tri( setup_ctx, +         sp_setup_tri( setup_ctx,                         get_vert(vertex_buffer, indices[i-2], stride),                         get_vert(vertex_buffer, indices[i-1], stride),                         get_vert(vertex_buffer, indices[i-0], stride) ); -         }        }        break;     case PIPE_PRIM_QUAD_STRIP: -      if (softpipe->rasterizer->flatshade_first) { -         for (i = 3; i < nr; i += 2) { -            sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[i-0], stride), -                       get_vert(vertex_buffer, indices[i-1], stride), -                       get_vert(vertex_buffer, indices[i-3], stride)); -            sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, indices[i-2], stride), -                       get_vert(vertex_buffer, indices[i-0], stride), -                       get_vert(vertex_buffer, indices[i-3], stride) ); -         } -      } -      else { -         for (i = 3; i < nr; i += 2) { -            sp_setup_tri( setup_ctx, +      for (i = 3; i < nr; i += 2) { +         sp_setup_tri( setup_ctx,                         get_vert(vertex_buffer, indices[i-3], stride),                         get_vert(vertex_buffer, indices[i-2], stride),                         get_vert(vertex_buffer, indices[i-0], stride) ); -            sp_setup_tri( setup_ctx, +         sp_setup_tri( setup_ctx,                         get_vert(vertex_buffer, indices[i-1], stride),                         get_vert(vertex_buffer, indices[i-3], stride),                         get_vert(vertex_buffer, indices[i-0], stride) ); -         }        }        break; @@ -326,9 +296,9 @@ sp_vbuf_draw(struct vbuf_render *vbr, const ushort *indices, uint nr)         */        for (i = 2; i < nr; i += 1) {           sp_setup_tri( setup_ctx, -                    get_vert(vertex_buffer, indices[i-0], stride), -                    get_vert(vertex_buffer, indices[i-1], stride), -                    get_vert(vertex_buffer, indices[0], stride) ); +                       get_vert(vertex_buffer, indices[i-0], stride), +                       get_vert(vertex_buffer, indices[i-1], stride), +                       get_vert(vertex_buffer, indices[0], stride) );        }        break; @@ -357,15 +327,15 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)     case PIPE_PRIM_POINTS:        for (i = 0; i < nr; i++) {           sp_setup_point( setup_ctx, -                      get_vert(vertex_buffer, i-0, stride) ); +                         get_vert(vertex_buffer, i-0, stride) );        }        break;     case PIPE_PRIM_LINES:        for (i = 1; i < nr; i += 2) {           sp_setup_line( setup_ctx, -                     get_vert(vertex_buffer, i-1, stride), -                     get_vert(vertex_buffer, i-0, stride) ); +                        get_vert(vertex_buffer, i-1, stride), +                        get_vert(vertex_buffer, i-0, stride) );        }        break; @@ -380,13 +350,13 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)     case PIPE_PRIM_LINE_LOOP:        for (i = 1; i < nr; i ++) {           sp_setup_line( setup_ctx, -                     get_vert(vertex_buffer, i-1, stride), -                     get_vert(vertex_buffer, i-0, stride) ); +                        get_vert(vertex_buffer, i-1, stride), +                        get_vert(vertex_buffer, i-0, stride) );        }        if (nr) {           sp_setup_line( setup_ctx, -                     get_vert(vertex_buffer, nr-1, stride), -                     get_vert(vertex_buffer, 0, stride) ); +                        get_vert(vertex_buffer, nr-1, stride), +                        get_vert(vertex_buffer, 0, stride) );        }        break; @@ -394,17 +364,17 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)        if (softpipe->rasterizer->flatshade_first) {           for (i = 2; i < nr; i += 3) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, i-1, stride), -                       get_vert(vertex_buffer, i-0, stride), -                       get_vert(vertex_buffer, i-2, stride) ); +                          get_vert(vertex_buffer, i-1, stride), +                          get_vert(vertex_buffer, i-0, stride), +                          get_vert(vertex_buffer, i-2, stride) );           }        }        else {           for (i = 2; i < nr; i += 3) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, i-2, stride), -                       get_vert(vertex_buffer, i-1, stride), -                       get_vert(vertex_buffer, i-0, stride) ); +                          get_vert(vertex_buffer, i-2, stride), +                          get_vert(vertex_buffer, i-1, stride), +                          get_vert(vertex_buffer, i-0, stride) );           }        }        break; @@ -413,17 +383,17 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)        if (softpipe->rasterizer->flatshade_first) {           for (i = 2; i < nr; i++) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, i+(i&1)-1, stride), -                       get_vert(vertex_buffer, i-(i&1), stride), -                       get_vert(vertex_buffer, i-2, stride) ); +                          get_vert(vertex_buffer, i+(i&1)-1, stride), +                          get_vert(vertex_buffer, i-(i&1), stride), +                          get_vert(vertex_buffer, i-2, stride) );           }        }        else {           for (i = 2; i < nr; i++) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, i+(i&1)-2, stride), -                       get_vert(vertex_buffer, i-(i&1)-1, stride), -                       get_vert(vertex_buffer, i-0, stride) ); +                          get_vert(vertex_buffer, i+(i&1)-2, stride), +                          get_vert(vertex_buffer, i-(i&1)-1, stride), +                          get_vert(vertex_buffer, i-0, stride) );           }        }        break; @@ -432,72 +402,44 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)        if (softpipe->rasterizer->flatshade_first) {           for (i = 2; i < nr; i += 1) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, i-0, stride), -                       get_vert(vertex_buffer, 0, stride), -                       get_vert(vertex_buffer, i-1, stride) ); +                          get_vert(vertex_buffer, i-0, stride), +                          get_vert(vertex_buffer, 0, stride), +                          get_vert(vertex_buffer, i-1, stride) );           }        }        else {           for (i = 2; i < nr; i += 1) {              sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, 0, stride), -                       get_vert(vertex_buffer, i-1, stride), -                       get_vert(vertex_buffer, i-0, stride) ); +                          get_vert(vertex_buffer, 0, stride), +                          get_vert(vertex_buffer, i-1, stride), +                          get_vert(vertex_buffer, i-0, stride) );           }        }        break;     case PIPE_PRIM_QUADS: -      if (softpipe->rasterizer->flatshade_first) { -         for (i = 3; i < nr; i += 4) { -            sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, i-2, stride), -                       get_vert(vertex_buffer, i-1, stride), -                       get_vert(vertex_buffer, i-3, stride) ); -            sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, i-1, stride), -                       get_vert(vertex_buffer, i-0, stride), -                       get_vert(vertex_buffer, i-3, stride) ); -         } -      } -      else { -         for (i = 3; i < nr; i += 4) { -            sp_setup_tri( setup_ctx, +      for (i = 3; i < nr; i += 4) { +         sp_setup_tri( setup_ctx,                         get_vert(vertex_buffer, i-3, stride),                         get_vert(vertex_buffer, i-2, stride),                         get_vert(vertex_buffer, i-0, stride) ); -            sp_setup_tri( setup_ctx, +         sp_setup_tri( setup_ctx,                         get_vert(vertex_buffer, i-2, stride),                         get_vert(vertex_buffer, i-1, stride),                         get_vert(vertex_buffer, i-0, stride) ); -         }        }        break;     case PIPE_PRIM_QUAD_STRIP: -      if (softpipe->rasterizer->flatshade_first) { -         for (i = 3; i < nr; i += 2) { -            sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, i-0, stride), -                       get_vert(vertex_buffer, i-1, stride), -                       get_vert(vertex_buffer, i-3, stride) ); -            sp_setup_tri( setup_ctx, -                       get_vert(vertex_buffer, i-2, stride), -                       get_vert(vertex_buffer, i-0, stride), -                       get_vert(vertex_buffer, i-3, stride) ); -         } -      } -      else { -         for (i = 3; i < nr; i += 2) { -            sp_setup_tri( setup_ctx, +      for (i = 3; i < nr; i += 2) { +         sp_setup_tri( setup_ctx,                         get_vert(vertex_buffer, i-3, stride),                         get_vert(vertex_buffer, i-2, stride),                         get_vert(vertex_buffer, i-0, stride) ); -            sp_setup_tri( setup_ctx, +         sp_setup_tri( setup_ctx,                         get_vert(vertex_buffer, i-1, stride),                         get_vert(vertex_buffer, i-3, stride),                         get_vert(vertex_buffer, i-0, stride) ); -         }        }        break; @@ -509,9 +451,9 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)         */        for (i = 2; i < nr; i += 1) {           sp_setup_tri( setup_ctx, -                    get_vert(vertex_buffer, i-1, stride), -                    get_vert(vertex_buffer, i-0, stride), -                    get_vert(vertex_buffer, 0, stride) ); +                       get_vert(vertex_buffer, i-1, stride), +                       get_vert(vertex_buffer, i-0, stride), +                       get_vert(vertex_buffer, 0, stride) );        }        break; @@ -521,12 +463,11 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)  } -  static void  sp_vbuf_destroy(struct vbuf_render *vbr)  {     struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr); -   if(cvbr->vertex_buffer) +   if (cvbr->vertex_buffer)        align_free(cvbr->vertex_buffer);     sp_setup_destroy_context(cvbr->setup);     FREE(cvbr); diff --git a/src/gallium/drivers/softpipe/sp_public.h b/src/gallium/drivers/softpipe/sp_public.h new file mode 100644 index 0000000000..62d0903d87 --- /dev/null +++ b/src/gallium/drivers/softpipe/sp_public.h @@ -0,0 +1,10 @@ +#ifndef SP_PUBLIC_H +#define SP_PUBLIC_H + +struct pipe_screen; +struct sw_winsys; + +struct pipe_screen * +softpipe_create_screen(struct sw_winsys *winsys); + +#endif diff --git a/src/gallium/drivers/softpipe/sp_quad_depth_test.c b/src/gallium/drivers/softpipe/sp_quad_depth_test.c index 17cd5b8207..72117c233e 100644 --- a/src/gallium/drivers/softpipe/sp_quad_depth_test.c +++ b/src/gallium/drivers/softpipe/sp_quad_depth_test.c @@ -75,7 +75,7 @@ get_depth_stencil_values( struct depth_data *data,        }        break;     case PIPE_FORMAT_Z24X8_UNORM: -   case PIPE_FORMAT_Z24S8_UNORM: +   case PIPE_FORMAT_Z24_UNORM_S8_USCALED:        for (j = 0; j < QUAD_SIZE; j++) {           int x = quad->input.x0 % TILE_SIZE + (j & 1);           int y = quad->input.y0 % TILE_SIZE + (j >> 1); @@ -84,7 +84,7 @@ get_depth_stencil_values( struct depth_data *data,        }     break;     case PIPE_FORMAT_X8Z24_UNORM: -   case PIPE_FORMAT_S8Z24_UNORM: +   case PIPE_FORMAT_S8_USCALED_Z24_UNORM:        for (j = 0; j < QUAD_SIZE; j++) {           int x = quad->input.x0 % TILE_SIZE + (j & 1);           int y = quad->input.y0 % TILE_SIZE + (j >> 1); @@ -153,7 +153,7 @@ convert_quad_depth( struct depth_data *data,        }        break;     case PIPE_FORMAT_Z24X8_UNORM: -   case PIPE_FORMAT_Z24S8_UNORM: +   case PIPE_FORMAT_Z24_UNORM_S8_USCALED:        {           float scale = (float) ((1 << 24) - 1); @@ -163,7 +163,7 @@ convert_quad_depth( struct depth_data *data,        }        break;     case PIPE_FORMAT_X8Z24_UNORM: -   case PIPE_FORMAT_S8Z24_UNORM: +   case PIPE_FORMAT_S8_USCALED_Z24_UNORM:        {           float scale = (float) ((1 << 24) - 1); @@ -206,14 +206,14 @@ write_depth_stencil_values( struct depth_data *data,           tile->data.depth32[y][x] = data->bzzzz[j];        }        break; -   case PIPE_FORMAT_Z24S8_UNORM: +   case PIPE_FORMAT_Z24_UNORM_S8_USCALED:        for (j = 0; j < QUAD_SIZE; j++) {           int x = quad->input.x0 % TILE_SIZE + (j & 1);           int y = quad->input.y0 % TILE_SIZE + (j >> 1);           tile->data.depth32[y][x] = (data->stencilVals[j] << 24) | data->bzzzz[j];        }        break; -   case PIPE_FORMAT_S8Z24_UNORM: +   case PIPE_FORMAT_S8_USCALED_Z24_UNORM:        for (j = 0; j < QUAD_SIZE; j++) {           int x = quad->input.x0 % TILE_SIZE + (j & 1);           int y = quad->input.y0 % TILE_SIZE + (j >> 1); @@ -520,6 +520,9 @@ depth_stencil_test_quad(struct quad_stage *qs,        face = 0;     } +   /* 0 = front-face, 1 = back-face */ +   assert(face == 0 || face == 1); +     /* choose front or back face function, operator, etc */     /* XXX we could do these initializations once per primitive */     func    = softpipe->depth_stencil->stencil[face].func; diff --git a/src/gallium/drivers/softpipe/sp_quad_pipe.c b/src/gallium/drivers/softpipe/sp_quad_pipe.c index 1b5bab4eca..43b8e88e33 100644 --- a/src/gallium/drivers/softpipe/sp_quad_pipe.c +++ b/src/gallium/drivers/softpipe/sp_quad_pipe.c @@ -59,5 +59,10 @@ sp_build_quad_pipeline(struct softpipe_context *sp)        sp_push_quad_first( sp, sp->quad.depth_test );        sp_push_quad_first( sp, sp->quad.shade );     } + +#if !DO_PSTIPPLE_IN_DRAW_MODULE +   if (sp->rasterizer->poly_stipple_enable) +      sp_push_quad_first( sp, sp->quad.pstipple ); +#endif  } diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c index 6ec63fe698..11aa0c4583 100644 --- a/src/gallium/drivers/softpipe/sp_screen.c +++ b/src/gallium/drivers/softpipe/sp_screen.c @@ -27,15 +27,18 @@  #include "util/u_memory.h" -#include "util/u_simple_screen.h" -#include "util/u_simple_screen.h" +#include "util/u_format.h" +#include "util/u_format_s3tc.h"  #include "pipe/p_defines.h"  #include "pipe/p_screen.h" +#include "state_tracker/sw_winsys.h" +  #include "sp_texture.h" -#include "sp_winsys.h"  #include "sp_screen.h"  #include "sp_context.h" +#include "sp_fence.h" +#include "sp_public.h"  static const char * @@ -83,11 +86,11 @@ softpipe_get_param(struct pipe_screen *screen, int param)     case PIPE_CAP_TEXTURE_SHADOW_MAP:        return 1;     case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: -      return 13; /* max 4Kx4K */ +      return SP_MAX_TEXTURE_2D_LEVELS;     case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: -      return 9;  /* max 256x256x256 */ +      return SP_MAX_TEXTURE_3D_LEVELS;     case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: -      return 13; /* max 4Kx4K */ +      return SP_MAX_TEXTURE_2D_LEVELS;     case PIPE_CAP_TGSI_CONT_SUPPORTED:        return 1;     case PIPE_CAP_BLEND_EQUATION_SEPARATE: @@ -142,39 +145,87 @@ static boolean  softpipe_is_format_supported( struct pipe_screen *screen,                                enum pipe_format format,                                 enum pipe_texture_target target, -                              unsigned tex_usage,  +                              unsigned bind,                                unsigned geom_flags )  { +   struct sw_winsys *winsys = softpipe_screen(screen)->winsys; +   const struct util_format_description *format_desc; +     assert(target == PIPE_TEXTURE_1D ||            target == PIPE_TEXTURE_2D ||            target == PIPE_TEXTURE_3D ||            target == PIPE_TEXTURE_CUBE); -   switch(format) { -   case PIPE_FORMAT_L16_UNORM: -   case PIPE_FORMAT_YUYV: -   case PIPE_FORMAT_UYVY: -   case PIPE_FORMAT_DXT1_RGB: -   case PIPE_FORMAT_DXT1_RGBA: -   case PIPE_FORMAT_DXT3_RGBA: -   case PIPE_FORMAT_DXT5_RGBA: -   case PIPE_FORMAT_Z32_FLOAT: -   case PIPE_FORMAT_R8G8_SNORM: -   case PIPE_FORMAT_R5SG5SB6U_NORM: -   case PIPE_FORMAT_R8SG8SB8UX8U_NORM: -   case PIPE_FORMAT_R8G8B8A8_SNORM: -   case PIPE_FORMAT_NONE: +   format_desc = util_format_description(format); +   if (!format_desc)        return FALSE; -   default: -      return TRUE; + +   if (bind & (PIPE_BIND_DISPLAY_TARGET | +               PIPE_BIND_SCANOUT | +               PIPE_BIND_SHARED)) { +      if(!winsys->is_displaytarget_format_supported(winsys, bind, format)) +         return FALSE; +   } + +   if (bind & PIPE_BIND_RENDER_TARGET) { +      if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) +         return FALSE; + +      /* +       * Although possible, it is unnatural to render into compressed or YUV +       * surfaces. So disable these here to avoid going into weird paths +       * inside the state trackers. +       */ +      if (format_desc->block.width != 1 || +          format_desc->block.height != 1) +         return FALSE; + +      /* +       * TODO: Unfortunately we cannot render into anything more than 32 bits +       * because we encode color clear values into a 32bit word. +       */ +      if (format_desc->block.bits > 32) +         return FALSE; +   } + +   if (bind & PIPE_BIND_DEPTH_STENCIL) { +      if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) +         return FALSE; + +      /* +       * TODO: Unfortunately we cannot render into anything more than 32 bits +       * because we encode depth and stencil clear values into a 32bit word. +       */ +      if (format_desc->block.bits > 32) +         return FALSE; + +      /* +       * TODO: eliminate this restriction +       */ +      if (format == PIPE_FORMAT_Z32_FLOAT) +         return FALSE; +   } + +   /* +    * All other operations (sampling, transfer, etc). +    */ + +   if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { +      return util_format_s3tc_enabled;     } + +   /* +    * Everything else should be supported by u_format. +    */ +   return TRUE;  }  static void  softpipe_destroy_screen( struct pipe_screen *screen )  { -   struct pipe_winsys *winsys = screen->winsys; +   struct softpipe_screen *sp_screen = softpipe_screen(screen); +   struct sw_winsys *winsys = sp_screen->winsys;     if(winsys->destroy)        winsys->destroy(winsys); @@ -183,21 +234,37 @@ softpipe_destroy_screen( struct pipe_screen *screen )  } +/* This is often overriden by the co-state tracker. + */ +static void +softpipe_flush_frontbuffer(struct pipe_screen *_screen, +                           struct pipe_surface *surface, +                           void *context_private) +{ +   struct softpipe_screen *screen = softpipe_screen(_screen); +   struct sw_winsys *winsys = screen->winsys; +   struct softpipe_resource *texture = softpipe_resource(surface->texture); + +   assert(texture->dt); +   if (texture->dt) +      winsys->displaytarget_display(winsys, texture->dt, context_private); +}  /**   * Create a new pipe_screen object   * Note: we're not presently subclassing pipe_screen (no softpipe_screen).   */  struct pipe_screen * -softpipe_create_screen(struct pipe_winsys *winsys) +softpipe_create_screen(struct sw_winsys *winsys)  {     struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen);     if (!screen)        return NULL; -   screen->base.winsys = winsys; +   screen->winsys = winsys; +   screen->base.winsys = NULL;     screen->base.destroy = softpipe_destroy_screen;     screen->base.get_name = softpipe_get_name; @@ -206,9 +273,12 @@ softpipe_create_screen(struct pipe_winsys *winsys)     screen->base.get_paramf = softpipe_get_paramf;     screen->base.is_format_supported = softpipe_is_format_supported;     screen->base.context_create = softpipe_create_context; +   screen->base.flush_frontbuffer = softpipe_flush_frontbuffer; + +   util_format_s3tc_init();     softpipe_init_screen_texture_funcs(&screen->base); -   u_simple_screen_init(&screen->base); +   softpipe_init_screen_fence_funcs(&screen->base);     return &screen->base;  } diff --git a/src/gallium/drivers/softpipe/sp_screen.h b/src/gallium/drivers/softpipe/sp_screen.h index 3d4bfd3e84..f741454c9e 100644 --- a/src/gallium/drivers/softpipe/sp_screen.h +++ b/src/gallium/drivers/softpipe/sp_screen.h @@ -35,10 +35,13 @@  #include "pipe/p_defines.h" +struct sw_winsys;  struct softpipe_screen {     struct pipe_screen base; +   struct sw_winsys *winsys; +     /* Increments whenever textures are modified.  Contexts can track      * this.      */ @@ -55,4 +58,5 @@ softpipe_screen( struct pipe_screen *pipe )  } +  #endif /* SP_SCREEN_H */ diff --git a/src/gallium/drivers/softpipe/sp_setup.c b/src/gallium/drivers/softpipe/sp_setup.c index e64aee6d82..86354664e4 100644 --- a/src/gallium/drivers/softpipe/sp_setup.c +++ b/src/gallium/drivers/softpipe/sp_setup.c @@ -47,6 +47,7 @@  #define DEBUG_VERTS 0  #define DEBUG_FRAGS 0 +  /**   * Triangle edge info   */ @@ -59,11 +60,16 @@ struct edge {  }; +/** + * Max number of quads (2x2 pixel blocks) to process per batch. + * This can't be arbitrarily increased since we depend on some 32-bit + * bitmasks (two bits per quad). + */  #define MAX_QUADS 16  /** - * Triangle setup info (derived from draw_stage). + * Triangle setup info.   * Also used for line drawing (taking some liberties).   */  struct setup_context { @@ -140,7 +146,7 @@ cull_tri(const struct setup_context *setup, float det)   * Clip setup->quad against the scissor/surface bounds.   */  static INLINE void -quad_clip( struct setup_context *setup, struct quad_header *quad ) +quad_clip(struct setup_context *setup, struct quad_header *quad)  {     const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect;     const int minx = (int) cliprect->minx; @@ -171,7 +177,7 @@ quad_clip( struct setup_context *setup, struct quad_header *quad )   * Emit a quad (pass to next stage) with clipping.   */  static INLINE void -clip_emit_quad( struct setup_context *setup, struct quad_header *quad ) +clip_emit_quad(struct setup_context *setup, struct quad_header *quad)  {     quad_clip( setup, quad ); @@ -188,12 +194,15 @@ clip_emit_quad( struct setup_context *setup, struct quad_header *quad )   * Given an X or Y coordinate, return the block/quad coordinate that it   * belongs to.   */ -static INLINE int block( int x ) +static INLINE int +block(int x)  {     return x & ~(2-1);  } -static INLINE int block_x( int x ) + +static INLINE int +block_x(int x)  {     return x & ~(16-1);  } @@ -202,9 +211,10 @@ static INLINE int block_x( int x )  /**   * Render a horizontal span of quads   */ -static void flush_spans( struct setup_context *setup ) +static void +flush_spans(struct setup_context *setup)  { -   const int step = 16; +   const int step = MAX_QUADS;     const int xleft0 = setup->span.left[0];     const int xleft1 = setup->span.left[1];     const int xright0 = setup->span.right[0]; @@ -265,8 +275,9 @@ static void flush_spans( struct setup_context *setup )  #if DEBUG_VERTS -static void print_vertex(const struct setup_context *setup, -                         const float (*v)[4]) +static void +print_vertex(const struct setup_context *setup, +             const float (*v)[4])  {     int i;     debug_printf("   Vertex: (%p)\n", (void *) v); @@ -280,16 +291,18 @@ static void print_vertex(const struct setup_context *setup,  }  #endif +  /**   * Sort the vertices from top to bottom order, setting up the triangle   * edge fields (ebot, emaj, etop).   * \return FALSE if coords are inf/nan (cull the tri), TRUE otherwise   */ -static boolean setup_sort_vertices( struct setup_context *setup, -                                    float det, -                                    const float (*v0)[4], -                                    const float (*v1)[4], -                                    const float (*v2)[4] ) +static boolean +setup_sort_vertices(struct setup_context *setup, +                    float det, +                    const float (*v0)[4], +                    const float (*v1)[4], +                    const float (*v2)[4])  {     setup->vprovoke = v2; @@ -374,6 +387,7 @@ static boolean setup_sort_vertices( struct setup_context *setup,     /* We need to know if this is a front or back-facing triangle for:      *  - the GLSL gl_FrontFacing fragment attribute (bool)      *  - two-sided stencil test +    * 0 = front-facing, 1 = back-facing      */     setup->facing =         ((det > 0.0) ^  @@ -446,9 +460,10 @@ tri_apply_cylindrical_wrap(float v0,   * \param slot  which attribute slot   * \param i  which component of the slot (0..3)   */ -static void const_coeff( struct setup_context *setup, -                         struct tgsi_interp_coef *coef, -                         uint vertSlot, uint i) +static void +const_coeff(struct setup_context *setup, +            struct tgsi_interp_coef *coef, +            uint vertSlot, uint i)  {     assert(i <= 3); @@ -590,7 +605,8 @@ setup_fragcoord_coeff(struct setup_context *setup, uint slot)   * Compute the setup->coef[] array dadx, dady, a0 values.   * Must be called after setup->vmin,vmid,vmax,vprovoke are initialized.   */ -static void setup_tri_coefficients( struct setup_context *setup ) +static void +setup_tri_coefficients(struct setup_context *setup)  {     struct softpipe_context *softpipe = setup->softpipe;     const struct sp_fragment_shader *spfs = softpipe->fs; @@ -649,7 +665,8 @@ static void setup_tri_coefficients( struct setup_context *setup )        }        if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FACE) { -         setup->coef[fragSlot].a0[0] = 1.0f - setup->facing; +         /* convert 0 to 1.0 and 1 to -1.0 */ +         setup->coef[fragSlot].a0[0] = setup->facing * -2.0f + 1.0f;           setup->coef[fragSlot].dadx[0] = 0.0;           setup->coef[fragSlot].dady[0] = 0.0;        } @@ -657,8 +674,8 @@ static void setup_tri_coefficients( struct setup_context *setup )  } - -static void setup_tri_edges( struct setup_context *setup ) +static void +setup_tri_edges(struct setup_context *setup)  {     float vmin_x = setup->vmin[0][0] + setup->pixel_offset;     float vmid_x = setup->vmid[0][0] + setup->pixel_offset; @@ -688,10 +705,11 @@ static void setup_tri_edges( struct setup_context *setup )   * Render the upper or lower half of a triangle.   * Scissoring/cliprect is applied here too.   */ -static void subtriangle( struct setup_context *setup, -			 struct edge *eleft, -			 struct edge *eright, -			 unsigned lines ) +static void +subtriangle(struct setup_context *setup, +            struct edge *eleft, +            struct edge *eright, +            int lines)  {     const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect;     const int minx = (int) cliprect->minx; @@ -702,6 +720,7 @@ static void subtriangle( struct setup_context *setup,     int sy = (int)eleft->sy;     assert((int)eleft->sy == (int) eright->sy); +   assert(lines >= 0);     /* clip top/bottom */     start_y = sy; @@ -764,9 +783,9 @@ static void subtriangle( struct setup_context *setup,   * calculate it here.   */  static float -calc_det( const float (*v0)[4], -          const float (*v1)[4], -          const float (*v2)[4] ) +calc_det(const float (*v0)[4], +         const float (*v1)[4], +         const float (*v2)[4])  {     /* edge vectors e = v0 - v2, f = v1 - v2 */     const float ex = v0[0][0] - v2[0][0]; @@ -782,10 +801,11 @@ calc_det( const float (*v0)[4],  /**   * Do setup for triangle rasterization, then render the triangle.   */ -void sp_setup_tri( struct setup_context *setup, -                const float (*v0)[4], -                const float (*v1)[4], -                const float (*v2)[4] ) +void +sp_setup_tri(struct setup_context *setup, +             const float (*v0)[4], +             const float (*v1)[4], +             const float (*v2)[4])  {     float det; @@ -925,7 +945,7 @@ line_persp_coeff(const struct setup_context *setup,   * Compute the setup->coef[] array dadx, dady, a0 values.   * Must be called after setup->vmin,vmax are initialized.   */ -static INLINE boolean +static boolean  setup_line_coefficients(struct setup_context *setup,                          const float (*v0)[4],                          const float (*v1)[4]) @@ -1001,7 +1021,8 @@ setup_line_coefficients(struct setup_context *setup,        }        if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FACE) { -         setup->coef[fragSlot].a0[0] = 1.0f - setup->facing; +         /* convert 0 to 1.0 and 1 to -1.0 */ +         setup->coef[fragSlot].a0[0] = setup->facing * -2.0f + 1.0f;           setup->coef[fragSlot].dadx[0] = 0.0;           setup->coef[fragSlot].dady[0] = 0.0;        } @@ -1046,8 +1067,8 @@ plot(struct setup_context *setup, int x, int y)   */  void  sp_setup_line(struct setup_context *setup, -           const float (*v0)[4], -           const float (*v1)[4]) +              const float (*v0)[4], +              const float (*v1)[4])  {     int x0 = (int) v0[0][0];     int x1 = (int) v1[0][0]; @@ -1175,8 +1196,8 @@ point_persp_coeff(const struct setup_context *setup,   * XXX could optimize a lot for 1-pixel points.   */  void -sp_setup_point( struct setup_context *setup, -             const float (*v0)[4] ) +sp_setup_point(struct setup_context *setup, +               const float (*v0)[4])  {     struct softpipe_context *softpipe = setup->softpipe;     const struct sp_fragment_shader *spfs = softpipe->fs; @@ -1247,7 +1268,8 @@ sp_setup_point( struct setup_context *setup,        }        if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FACE) { -         setup->coef[fragSlot].a0[0] = 1.0f - setup->facing; +         /* convert 0 to 1.0 and 1 to -1.0 */ +         setup->coef[fragSlot].a0[0] = setup->facing * -2.0f + 1.0f;           setup->coef[fragSlot].dadx[0] = 0.0;           setup->coef[fragSlot].dady[0] = 0.0;        } @@ -1376,7 +1398,12 @@ sp_setup_point( struct setup_context *setup,     }  } -void sp_setup_prepare( struct setup_context *setup ) + +/** + * Called by vbuf code just before we start buffering primitives. + */ +void +sp_setup_prepare(struct setup_context *setup)  {     struct softpipe_context *sp = setup->softpipe; @@ -1402,8 +1429,8 @@ void sp_setup_prepare( struct setup_context *setup )  } - -void sp_setup_destroy_context( struct setup_context *setup ) +void +sp_setup_destroy_context(struct setup_context *setup)  {     FREE( setup );  } @@ -1412,7 +1439,8 @@ void sp_setup_destroy_context( struct setup_context *setup )  /**   * Create a new primitive setup/render stage.   */ -struct setup_context *sp_setup_create_context( struct softpipe_context *softpipe ) +struct setup_context * +sp_setup_create_context(struct softpipe_context *softpipe)  {     struct setup_context *setup = CALLOC_STRUCT(setup_context);     unsigned i; @@ -1429,4 +1457,3 @@ struct setup_context *sp_setup_create_context( struct softpipe_context *softpipe     return setup;  } - diff --git a/src/gallium/drivers/softpipe/sp_state.h b/src/gallium/drivers/softpipe/sp_state.h index 4370bbeaee..f97fc6eca8 100644 --- a/src/gallium/drivers/softpipe/sp_state.h +++ b/src/gallium/drivers/softpipe/sp_state.h @@ -100,6 +100,11 @@ struct sp_geometry_shader {     struct draw_geometry_shader *draw_data;  }; +struct sp_velems_state { +   unsigned count; +   struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS]; +}; +  void *  softpipe_create_blend_state(struct pipe_context *, @@ -145,7 +150,7 @@ void softpipe_set_clip_state( struct pipe_context *,  void softpipe_set_constant_buffer(struct pipe_context *,                                    uint shader, uint index, -                                  struct pipe_buffer *buf); +                                  struct pipe_resource *buf);  void *softpipe_create_fs_state(struct pipe_context *,                                 const struct pipe_shader_state *); @@ -160,28 +165,39 @@ void *softpipe_create_gs_state(struct pipe_context *,  void softpipe_bind_gs_state(struct pipe_context *, void *);  void softpipe_delete_gs_state(struct pipe_context *, void *); +void *softpipe_create_vertex_elements_state(struct pipe_context *, +                                            unsigned count, +                                            const struct pipe_vertex_element *); +void softpipe_bind_vertex_elements_state(struct pipe_context *, void *); +void softpipe_delete_vertex_elements_state(struct pipe_context *, void *); +  void softpipe_set_polygon_stipple( struct pipe_context *, -				  const struct pipe_poly_stipple * ); +                                   const struct pipe_poly_stipple * );  void softpipe_set_scissor_state( struct pipe_context *,                                   const struct pipe_scissor_state * ); -void softpipe_set_sampler_textures( struct pipe_context *, -                                    unsigned num, -                                    struct pipe_texture ** ); +void softpipe_set_sampler_views( struct pipe_context *, +                                 unsigned num, +                                 struct pipe_sampler_view ** );  void -softpipe_set_vertex_sampler_textures(struct pipe_context *, -                                     unsigned num_textures, -                                     struct pipe_texture **); +softpipe_set_vertex_sampler_views(struct pipe_context *, +                                  unsigned num, +                                  struct pipe_sampler_view **); + +struct pipe_sampler_view * +softpipe_create_sampler_view(struct pipe_context *pipe, +                             struct pipe_resource *texture, +                             const struct pipe_sampler_view *templ); + +void +softpipe_sampler_view_destroy(struct pipe_context *pipe, +                              struct pipe_sampler_view *view);  void softpipe_set_viewport_state( struct pipe_context *,                                    const struct pipe_viewport_state * ); -void softpipe_set_vertex_elements(struct pipe_context *, -                                  unsigned count, -                                  const struct pipe_vertex_element *); -  void softpipe_set_vertex_buffers(struct pipe_context *,                                   unsigned count,                                   const struct pipe_vertex_buffer *); @@ -194,13 +210,14 @@ void softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,                            unsigned start, unsigned count);  void softpipe_draw_elements(struct pipe_context *pipe, -                            struct pipe_buffer *indexBuffer, -                            unsigned indexSize, +                            struct pipe_resource *indexBuffer, +                            unsigned indexSize, int indexBias,                              unsigned mode, unsigned start, unsigned count);  void  softpipe_draw_range_elements(struct pipe_context *pipe, -                             struct pipe_buffer *indexBuffer, +                             struct pipe_resource *indexBuffer,                               unsigned indexSize, +                             int indexBias,                               unsigned min_index,                               unsigned max_index,                               unsigned mode, unsigned start, unsigned count); @@ -215,8 +232,9 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,  void  softpipe_draw_elements_instanced(struct pipe_context *pipe, -                                 struct pipe_buffer *indexBuffer, +                                 struct pipe_resource *indexBuffer,                                   unsigned indexSize, +                                 int indexBias,                                   unsigned mode,                                   unsigned start,                                   unsigned count, diff --git a/src/gallium/drivers/softpipe/sp_state_derived.c b/src/gallium/drivers/softpipe/sp_state_derived.c index d2eda7324c..4c6d4909f5 100644 --- a/src/gallium/drivers/softpipe/sp_state_derived.c +++ b/src/gallium/drivers/softpipe/sp_state_derived.c @@ -202,7 +202,7 @@ update_tgsi_samplers( struct softpipe_context *softpipe )     for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {        struct softpipe_tex_tile_cache *tc = softpipe->tex_cache[i];        if (tc->texture) { -         struct softpipe_texture *spt = softpipe_texture(tc->texture); +         struct softpipe_resource *spt = softpipe_resource(tc->texture);           if (spt->timestamp != tc->timestamp) {  	    sp_tex_tile_cache_validate_texture( tc );              /* @@ -217,7 +217,7 @@ update_tgsi_samplers( struct softpipe_context *softpipe )        struct softpipe_tex_tile_cache *tc = softpipe->vertex_tex_cache[i];        if (tc->texture) { -         struct softpipe_texture *spt = softpipe_texture(tc->texture); +         struct softpipe_resource *spt = softpipe_resource(tc->texture);           if (spt->timestamp != tc->timestamp) {  	    sp_tex_tile_cache_validate_texture(tc); diff --git a/src/gallium/drivers/softpipe/sp_state_fs.c b/src/gallium/drivers/softpipe/sp_state_fs.c index c88e213751..7f072f5a26 100644 --- a/src/gallium/drivers/softpipe/sp_state_fs.c +++ b/src/gallium/drivers/softpipe/sp_state_fs.c @@ -28,6 +28,7 @@  #include "sp_context.h"  #include "sp_state.h"  #include "sp_fs.h" +#include "sp_texture.h"  #include "pipe/p_defines.h"  #include "util/u_memory.h" @@ -163,26 +164,32 @@ softpipe_delete_vs_state(struct pipe_context *pipe, void *vs)     FREE( state );  } - -  void  softpipe_set_constant_buffer(struct pipe_context *pipe,                               uint shader, uint index, -                             struct pipe_buffer *buf) +                             struct pipe_resource *constants)  {     struct softpipe_context *softpipe = softpipe_context(pipe); +   unsigned size = constants ? constants->width0 : 0; +   const void *data = constants ? softpipe_resource(constants)->data : NULL;     assert(shader < PIPE_SHADER_TYPES); -   assert(index < PIPE_MAX_CONSTANT_BUFFERS); +   assert(index == 0);     draw_flush(softpipe->draw);     /* note: reference counting */ -   pipe_buffer_reference(&softpipe->constants[shader][index], buf); +   pipe_resource_reference(&softpipe->constants[shader][index], constants); +   if (shader == PIPE_SHADER_VERTEX || shader == PIPE_SHADER_GEOMETRY) { +      draw_set_mapped_constant_buffer(softpipe->draw, shader, index, data, size); +   } + +   softpipe->mapped_constants[shader][index] = data;     softpipe->dirty |= SP_NEW_CONSTANTS;  } +  void *  softpipe_create_gs_state(struct pipe_context *pipe,                           const struct pipe_shader_state *templ) diff --git a/src/gallium/drivers/softpipe/sp_state_sampler.c b/src/gallium/drivers/softpipe/sp_state_sampler.c index ceb4e338f1..2692f06c92 100644 --- a/src/gallium/drivers/softpipe/sp_state_sampler.c +++ b/src/gallium/drivers/softpipe/sp_state_sampler.c @@ -30,6 +30,7 @@   */  #include "util/u_memory.h" +#include "util/u_inlines.h"  #include "draw/draw_context.h"  #include "draw/draw_context.h" @@ -121,9 +122,38 @@ softpipe_bind_vertex_sampler_states(struct pipe_context *pipe,  } +struct pipe_sampler_view * +softpipe_create_sampler_view(struct pipe_context *pipe, +                             struct pipe_resource *resource, +                             const struct pipe_sampler_view *templ) +{ +   struct pipe_sampler_view *view = CALLOC_STRUCT(pipe_sampler_view); + +   if (view) { +      *view = *templ; +      view->reference.count = 1; +      view->texture = NULL; +      pipe_resource_reference(&view->texture, resource); +      view->context = pipe; +   } + +   return view; +} + + +void +softpipe_sampler_view_destroy(struct pipe_context *pipe, +                              struct pipe_sampler_view *view) +{ +   pipe_resource_reference(&view->texture, NULL); +   FREE(view); +} + +  void -softpipe_set_sampler_textures(struct pipe_context *pipe, -                              unsigned num, struct pipe_texture **texture) +softpipe_set_sampler_views(struct pipe_context *pipe, +                           unsigned num, +                           struct pipe_sampler_view **views)  {     struct softpipe_context *softpipe = softpipe_context(pipe);     uint i; @@ -131,51 +161,51 @@ softpipe_set_sampler_textures(struct pipe_context *pipe,     assert(num <= PIPE_MAX_SAMPLERS);     /* Check for no-op */ -   if (num == softpipe->num_textures && -       !memcmp(softpipe->texture, texture, num * sizeof(struct pipe_texture *))) +   if (num == softpipe->num_sampler_views && +       !memcmp(softpipe->sampler_views, views, num * sizeof(struct pipe_sampler_view *)))        return;     draw_flush(softpipe->draw);     for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { -      struct pipe_texture *tex = i < num ? texture[i] : NULL; +      struct pipe_sampler_view *view = i < num ? views[i] : NULL; -      pipe_texture_reference(&softpipe->texture[i], tex); -      sp_tex_tile_cache_set_texture(softpipe->tex_cache[i], tex); +      pipe_sampler_view_reference(&softpipe->sampler_views[i], view); +      sp_tex_tile_cache_set_sampler_view(softpipe->tex_cache[i], view);     } -   softpipe->num_textures = num; +   softpipe->num_sampler_views = num;     softpipe->dirty |= SP_NEW_TEXTURE;  }  void -softpipe_set_vertex_sampler_textures(struct pipe_context *pipe, -                                     unsigned num_textures, -                                     struct pipe_texture **textures) +softpipe_set_vertex_sampler_views(struct pipe_context *pipe, +                                  unsigned num, +                                  struct pipe_sampler_view **views)  {     struct softpipe_context *softpipe = softpipe_context(pipe);     uint i; -   assert(num_textures <= PIPE_MAX_VERTEX_SAMPLERS); +   assert(num <= PIPE_MAX_VERTEX_SAMPLERS);     /* Check for no-op */ -   if (num_textures == softpipe->num_vertex_textures && -       !memcmp(softpipe->vertex_textures, textures, num_textures * sizeof(struct pipe_texture *))) { +   if (num == softpipe->num_vertex_sampler_views && +       !memcmp(softpipe->vertex_sampler_views, views, num * sizeof(struct pipe_sampler_view *))) {        return;     }     draw_flush(softpipe->draw);     for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) { -      struct pipe_texture *tex = i < num_textures ? textures[i] : NULL; +      struct pipe_sampler_view *view = i < num ? views[i] : NULL; -      pipe_texture_reference(&softpipe->vertex_textures[i], tex); -      sp_tex_tile_cache_set_texture(softpipe->vertex_tex_cache[i], tex); +      pipe_sampler_view_reference(&softpipe->vertex_sampler_views[i], view); +      sp_tex_tile_cache_set_sampler_view(softpipe->vertex_tex_cache[i], view);     } -   softpipe->num_vertex_textures = num_textures; +   softpipe->num_vertex_sampler_views = num;     softpipe->dirty |= SP_NEW_TEXTURE;  } @@ -194,10 +224,10 @@ softpipe_set_vertex_sampler_textures(struct pipe_context *pipe,  static struct sp_sampler_varient *  get_sampler_varient( unsigned unit,                       struct sp_sampler *sampler, -                     struct pipe_texture *texture, +                     struct pipe_resource *resource,                       unsigned processor )  { -   struct softpipe_texture *sp_texture = softpipe_texture(texture); +   struct softpipe_resource *sp_texture = softpipe_resource(resource);     struct sp_sampler_varient *v = NULL;     union sp_sampler_key key; @@ -245,29 +275,41 @@ softpipe_reset_sampler_varients(struct softpipe_context *softpipe)      */     for (i = 0; i <= softpipe->vs->max_sampler; i++) {        if (softpipe->vertex_samplers[i]) { +         struct pipe_resource *texture = NULL; + +         if (softpipe->vertex_sampler_views[i]) { +            texture = softpipe->vertex_sampler_views[i]->texture; +         } +           softpipe->tgsi.vert_samplers_list[i] =               get_sampler_varient( i, -                                sp_sampler(softpipe->vertex_samplers[i]), -                                softpipe->vertex_textures[i], +                                 sp_sampler(softpipe->vertex_samplers[i]), +                                 texture,                                   TGSI_PROCESSOR_VERTEX );           sp_sampler_varient_bind_texture( softpipe->tgsi.vert_samplers_list[i],  -                                         softpipe->vertex_tex_cache[i], -                                         softpipe->vertex_textures[i] ); +                                          softpipe->vertex_tex_cache[i], +                                          texture );        }     }     for (i = 0; i <= softpipe->fs->info.file_max[TGSI_FILE_SAMPLER]; i++) {        if (softpipe->sampler[i]) { +         struct pipe_resource *texture = NULL; + +         if (softpipe->sampler_views[i]) { +            texture = softpipe->sampler_views[i]->texture; +         } +           softpipe->tgsi.frag_samplers_list[i] =              get_sampler_varient( i,                                   sp_sampler(softpipe->sampler[i]), -                                 softpipe->texture[i], +                                 texture,                                   TGSI_PROCESSOR_FRAGMENT );           sp_sampler_varient_bind_texture( softpipe->tgsi.frag_samplers_list[i],                                             softpipe->tex_cache[i], -                                          softpipe->texture[i] ); +                                          texture );        }     }  } diff --git a/src/gallium/drivers/softpipe/sp_state_vertex.c b/src/gallium/drivers/softpipe/sp_state_vertex.c index b491d92ed1..462f4d2655 100644 --- a/src/gallium/drivers/softpipe/sp_state_vertex.c +++ b/src/gallium/drivers/softpipe/sp_state_vertex.c @@ -32,27 +32,45 @@  #include "sp_context.h"  #include "sp_state.h" +#include "util/u_memory.h"  #include "draw/draw_context.h" +void * +softpipe_create_vertex_elements_state(struct pipe_context *pipe, +                                      unsigned count, +                                      const struct pipe_vertex_element *attribs) +{ +   struct sp_velems_state *velems; +   assert(count <= PIPE_MAX_ATTRIBS); +   velems = (struct sp_velems_state *) MALLOC(sizeof(struct sp_velems_state)); +   if (velems) { +      velems->count = count; +      memcpy(velems->velem, attribs, sizeof(*attribs) * count); +   } +   return velems; +} +  void -softpipe_set_vertex_elements(struct pipe_context *pipe, -                             unsigned count, -                             const struct pipe_vertex_element *attribs) +softpipe_bind_vertex_elements_state(struct pipe_context *pipe, +                                    void *velems)  {     struct softpipe_context *softpipe = softpipe_context(pipe); +   struct sp_velems_state *sp_velems = (struct sp_velems_state *) velems; -   assert(count <= PIPE_MAX_ATTRIBS); - -   memcpy(softpipe->vertex_element, attribs, -          count * sizeof(struct pipe_vertex_element)); -   softpipe->num_vertex_elements = count; +   softpipe->velems = sp_velems;     softpipe->dirty |= SP_NEW_VERTEX; -   draw_set_vertex_elements(softpipe->draw, count, attribs); +   if (sp_velems) +      draw_set_vertex_elements(softpipe->draw, sp_velems->count, sp_velems->velem);  } +void +softpipe_delete_vertex_elements_state(struct pipe_context *pipe, void *velems) +{ +   FREE( velems ); +}  void  softpipe_set_vertex_buffers(struct pipe_context *pipe, diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c index ef7ccf4189..ff83c66d8b 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.c +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c @@ -547,7 +547,7 @@ compute_lambda_1d(const struct sp_sampler_varient *samp,                    const float t[QUAD_SIZE],                    const float p[QUAD_SIZE])  { -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     float dsdx = fabsf(s[QUAD_BOTTOM_RIGHT] - s[QUAD_BOTTOM_LEFT]);     float dsdy = fabsf(s[QUAD_TOP_LEFT]     - s[QUAD_BOTTOM_LEFT]);     float rho = MAX2(dsdx, dsdy) * texture->width0; @@ -562,7 +562,7 @@ compute_lambda_2d(const struct sp_sampler_varient *samp,                    const float t[QUAD_SIZE],                    const float p[QUAD_SIZE])  { -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     float dsdx = fabsf(s[QUAD_BOTTOM_RIGHT] - s[QUAD_BOTTOM_LEFT]);     float dsdy = fabsf(s[QUAD_TOP_LEFT]     - s[QUAD_BOTTOM_LEFT]);     float dtdx = fabsf(t[QUAD_BOTTOM_RIGHT] - t[QUAD_BOTTOM_LEFT]); @@ -581,7 +581,7 @@ compute_lambda_3d(const struct sp_sampler_varient *samp,                    const float t[QUAD_SIZE],                    const float p[QUAD_SIZE])  { -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     float dsdx = fabsf(s[QUAD_BOTTOM_RIGHT] - s[QUAD_BOTTOM_LEFT]);     float dsdy = fabsf(s[QUAD_TOP_LEFT]     - s[QUAD_BOTTOM_LEFT]);     float dtdx = fabsf(t[QUAD_BOTTOM_RIGHT] - t[QUAD_BOTTOM_LEFT]); @@ -651,7 +651,7 @@ static INLINE const float *  get_texel_2d(const struct sp_sampler_varient *samp,  	     union tex_tile_address addr, int x, int y)  { -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     unsigned level = addr.bits.level;     if (x < 0 || x >= (int) u_minify(texture->width0, level) || @@ -744,7 +744,7 @@ static INLINE const float *  get_texel_3d(const struct sp_sampler_varient *samp,  	     union tex_tile_address addr, int x, int y, int z)  { -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     unsigned level = addr.bits.level;     if (x < 0 || x >= (int) u_minify(texture->width0, level) || @@ -932,7 +932,7 @@ img_filter_1d_nearest(struct tgsi_sampler *tgsi_sampler,                          float rgba[NUM_CHANNELS][QUAD_SIZE])  {     const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     unsigned level0, j;     int width;     int x[4]; @@ -968,7 +968,7 @@ img_filter_2d_nearest(struct tgsi_sampler *tgsi_sampler,                        float rgba[NUM_CHANNELS][QUAD_SIZE])  {     const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     unsigned level0, j;     int width, height;     int x[4], y[4]; @@ -1016,7 +1016,7 @@ img_filter_cube_nearest(struct tgsi_sampler *tgsi_sampler,                          float rgba[NUM_CHANNELS][QUAD_SIZE])  {     const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     const unsigned *faces = samp->faces; /* zero when not cube-mapping */     unsigned level0, j;     int width, height; @@ -1056,7 +1056,7 @@ img_filter_3d_nearest(struct tgsi_sampler *tgsi_sampler,                        float rgba[NUM_CHANNELS][QUAD_SIZE])  {     const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     unsigned level0, j;     int width, height, depth;     int x[4], y[4], z[4]; @@ -1098,7 +1098,7 @@ img_filter_1d_linear(struct tgsi_sampler *tgsi_sampler,                       float rgba[NUM_CHANNELS][QUAD_SIZE])  {     const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     unsigned level0, j;     int width;     int x0[4], x1[4]; @@ -1138,7 +1138,7 @@ img_filter_2d_linear(struct tgsi_sampler *tgsi_sampler,                       float rgba[NUM_CHANNELS][QUAD_SIZE])  {     const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     unsigned level0, j;     int width, height;     int x0[4], y0[4], x1[4], y1[4]; @@ -1185,7 +1185,7 @@ img_filter_cube_linear(struct tgsi_sampler *tgsi_sampler,                         float rgba[NUM_CHANNELS][QUAD_SIZE])  {     const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     const unsigned *faces = samp->faces; /* zero when not cube-mapping */     unsigned level0, j;     int width, height; @@ -1234,7 +1234,7 @@ img_filter_3d_linear(struct tgsi_sampler *tgsi_sampler,                       float rgba[NUM_CHANNELS][QUAD_SIZE])  {     const struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     unsigned level0, j;     int width, height, depth;     int x0[4], x1[4], y0[4], y1[4], z0[4], z1[4]; @@ -1310,7 +1310,7 @@ mip_filter_linear(struct tgsi_sampler *tgsi_sampler,                    float rgba[NUM_CHANNELS][QUAD_SIZE])  {     struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     int level0;     float lambda;     float lod[QUAD_SIZE]; @@ -1373,7 +1373,7 @@ mip_filter_nearest(struct tgsi_sampler *tgsi_sampler,                     float rgba[NUM_CHANNELS][QUAD_SIZE])  {     struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     float lambda;     float lod[QUAD_SIZE]; @@ -1461,7 +1461,7 @@ mip_filter_linear_2d_linear_repeat_POT(     float rgba[NUM_CHANNELS][QUAD_SIZE])  {     struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler); -   const struct pipe_texture *texture = samp->texture; +   const struct pipe_resource *texture = samp->texture;     int level0;     float lambda;     float lod[QUAD_SIZE]; @@ -1614,7 +1614,6 @@ sample_cube(struct tgsi_sampler *tgsi_sampler,     struct sp_sampler_varient *samp = sp_sampler_varient(tgsi_sampler);     unsigned j;     float ssss[4], tttt[4]; -   unsigned face;     /*       major axis @@ -1628,7 +1627,8 @@ sample_cube(struct tgsi_sampler *tgsi_sampler,       -rz          TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT    -rx    -ry   rz     */ -   /* First choose the cube face. +   /* Choose the cube face and compute new s/t coords for the 2D face. +    *      * Use the same cube face for all four pixels in the quad.      *      * This isn't ideal, but if we want to use a different cube face @@ -1647,85 +1647,37 @@ sample_cube(struct tgsi_sampler *tgsi_sampler,        const float arx = fabsf(rx), ary = fabsf(ry), arz = fabsf(rz);        if (arx >= ary && arx >= arz) { -         if (rx >= 0.0F) { -            face = PIPE_TEX_FACE_POS_X; -         } -         else { -            face = PIPE_TEX_FACE_NEG_X; +         float sign = (rx >= 0.0F) ? 1.0F : -1.0F; +         uint face = (rx >= 0.0F) ? PIPE_TEX_FACE_POS_X : PIPE_TEX_FACE_NEG_X; +         for (j = 0; j < QUAD_SIZE; j++) { +            const float ima = -0.5F / fabsf(s[j]); +            ssss[j] = sign *  p[j] * ima + 0.5F; +            tttt[j] =         t[j] * ima + 0.5F; +            samp->faces[j] = face;           }        }        else if (ary >= arx && ary >= arz) { -         if (ry >= 0.0F) { -            face = PIPE_TEX_FACE_POS_Y; -         } -         else { -            face = PIPE_TEX_FACE_NEG_Y; +         float sign = (ry >= 0.0F) ? 1.0F : -1.0F; +         uint face = (ry >= 0.0F) ? PIPE_TEX_FACE_POS_Y : PIPE_TEX_FACE_NEG_Y; +         for (j = 0; j < QUAD_SIZE; j++) { +            const float ima = -0.5F / fabsf(t[j]); +            ssss[j] =        -s[j] * ima + 0.5F; +            tttt[j] = sign * -p[j] * ima + 0.5F; +            samp->faces[j] = face;           }        }        else { -         if (rz > 0.0F) { -            face = PIPE_TEX_FACE_POS_Z; -         } -         else { -            face = PIPE_TEX_FACE_NEG_Z; +         float sign = (rz >= 0.0F) ? 1.0F : -1.0F; +         uint face = (rz >= 0.0F) ? PIPE_TEX_FACE_POS_Z : PIPE_TEX_FACE_NEG_Z; +         for (j = 0; j < QUAD_SIZE; j++) { +            const float ima = -0.5 / fabsf(p[j]); +            ssss[j] = sign * -s[j] * ima + 0.5F; +            tttt[j] =         t[j] * ima + 0.5F; +            samp->faces[j] = face;           }        }     } -   /* Now compute the 2D _face_ texture coords from the -    * 3D _cube_ texture coords. -    */ -   for (j = 0; j < QUAD_SIZE; j++) { -      const float rx = s[j], ry = t[j], rz = p[j]; -      const float arx = fabsf(rx), ary = fabsf(ry), arz = fabsf(rz); -      float sc, tc, ma; - -      switch (face) { -      case PIPE_TEX_FACE_POS_X: -         sc = -rz; -         tc = -ry; -         ma = arx; -         break; -      case PIPE_TEX_FACE_NEG_X: -         sc = rz; -         tc = -ry; -         ma = arx; -         break; -      case PIPE_TEX_FACE_POS_Y: -         sc = rx; -         tc = rz; -         ma = ary; -         break; -      case PIPE_TEX_FACE_NEG_Y: -         sc = rx; -         tc = -rz; -         ma = ary; -         break; -      case PIPE_TEX_FACE_POS_Z: -         sc = rx; -         tc = -ry; -         ma = arz; -         break; -      case PIPE_TEX_FACE_NEG_Z: -         sc = -rx; -         tc = -ry; -         ma = arz; -         break; -      default: -         assert(0 && "bad cube face"); -         sc = 0.0F; -         tc = 0.0F; -         ma = 0.0F; -      } - -      { -	 const float ima = 1.0 / ma; -	 ssss[j] = ( sc * ima + 1.0F ) * 0.5F; -	 tttt[j] = ( tc * ima + 1.0F ) * 0.5F; -	 samp->faces[j] = face; -      } -   } -     /* In our little pipeline, the compare stage is next.  If compare      * is not active, this will point somewhere deeper into the      * pipeline, eg. to mip_filter or even img_filter. @@ -1915,7 +1867,7 @@ get_img_filter(const union sp_sampler_key key,  void  sp_sampler_varient_bind_texture( struct sp_sampler_varient *samp,                                   struct softpipe_tex_tile_cache *tex_cache, -                                 const struct pipe_texture *texture ) +                                 const struct pipe_resource *texture )  {     const struct pipe_sampler_state *sampler = samp->sampler; diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.h b/src/gallium/drivers/softpipe/sp_tex_sample.h index b6e66c998a..6114acf737 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.h +++ b/src/gallium/drivers/softpipe/sp_tex_sample.h @@ -85,7 +85,7 @@ struct sp_sampler_varient     /* Currently bound texture:      */ -   const struct pipe_texture *texture; +   const struct pipe_resource *texture;     struct softpipe_tex_tile_cache *cache;     unsigned processor; @@ -129,7 +129,7 @@ sp_create_sampler_varient( const struct pipe_sampler_state *sampler,  void sp_sampler_varient_bind_texture( struct sp_sampler_varient *varient,                                        struct softpipe_tex_tile_cache *tex_cache, -                                      const struct pipe_texture *tex ); +                                      const struct pipe_resource *tex );  void sp_sampler_varient_destroy( struct sp_sampler_varient * ); diff --git a/src/gallium/drivers/softpipe/sp_tex_tile_cache.c b/src/gallium/drivers/softpipe/sp_tex_tile_cache.c index a0b95c8884..fbce9e042b 100644 --- a/src/gallium/drivers/softpipe/sp_tex_tile_cache.c +++ b/src/gallium/drivers/softpipe/sp_tex_tile_cache.c @@ -43,14 +43,14 @@  struct softpipe_tex_tile_cache * -sp_create_tex_tile_cache( struct pipe_screen *screen ) +sp_create_tex_tile_cache( struct pipe_context *pipe )  {     struct softpipe_tex_tile_cache *tc;     uint pos;     tc = CALLOC_STRUCT( softpipe_tex_tile_cache );     if (tc) { -      tc->screen = screen; +      tc->pipe = pipe;        for (pos = 0; pos < NUM_ENTRIES; pos++) {           tc->entries[pos].addr.bits.invalid = 1;        } @@ -63,19 +63,16 @@ sp_create_tex_tile_cache( struct pipe_screen *screen )  void  sp_destroy_tex_tile_cache(struct softpipe_tex_tile_cache *tc)  { -   struct pipe_screen *screen;     uint pos;     for (pos = 0; pos < NUM_ENTRIES; pos++) {        /*assert(tc->entries[pos].x < 0);*/     }     if (tc->transfer) { -      screen = tc->transfer->texture->screen; -      screen->tex_transfer_destroy(tc->transfer); +      tc->pipe->transfer_destroy(tc->pipe, tc->transfer);     }     if (tc->tex_trans) { -      screen = tc->tex_trans->texture->screen; -      screen->tex_transfer_destroy(tc->tex_trans); +      tc->pipe->transfer_destroy(tc->pipe, tc->tex_trans);     }     FREE( tc ); @@ -88,7 +85,7 @@ void  sp_tex_tile_cache_map_transfers(struct softpipe_tex_tile_cache *tc)  {     if (tc->tex_trans && !tc->tex_trans_map) -      tc->tex_trans_map = tc->screen->transfer_map(tc->screen, tc->tex_trans); +      tc->tex_trans_map = tc->pipe->transfer_map(tc->pipe, tc->tex_trans);  } @@ -96,7 +93,7 @@ void  sp_tex_tile_cache_unmap_transfers(struct softpipe_tex_tile_cache *tc)  {     if (tc->tex_trans_map) { -      tc->screen->transfer_unmap(tc->screen, tc->tex_trans); +      tc->pipe->transfer_unmap(tc->pipe, tc->tex_trans);        tc->tex_trans_map = NULL;     }  } @@ -119,31 +116,38 @@ sp_tex_tile_cache_validate_texture(struct softpipe_tex_tile_cache *tc)  }  /** - * Specify the texture to cache. + * Specify the sampler view to cache.   */  void -sp_tex_tile_cache_set_texture(struct softpipe_tex_tile_cache *tc, -                          struct pipe_texture *texture) +sp_tex_tile_cache_set_sampler_view(struct softpipe_tex_tile_cache *tc, +                                   struct pipe_sampler_view *view)  { +   struct pipe_resource *texture = view ? view->texture : NULL;     uint i;     assert(!tc->transfer);     if (tc->texture != texture) { -      pipe_texture_reference(&tc->texture, texture); +      pipe_resource_reference(&tc->texture, texture);        if (tc->tex_trans) { -         struct pipe_screen *screen = tc->tex_trans->texture->screen; -                    if (tc->tex_trans_map) { -            screen->transfer_unmap(screen, tc->tex_trans); +            tc->pipe->transfer_unmap(tc->pipe, tc->tex_trans);              tc->tex_trans_map = NULL;           } -         screen->tex_transfer_destroy(tc->tex_trans); +         tc->pipe->transfer_destroy(tc->pipe, tc->tex_trans);           tc->tex_trans = NULL;        } +      if (view) { +         tc->swizzle_r = view->swizzle_r; +         tc->swizzle_g = view->swizzle_g; +         tc->swizzle_b = view->swizzle_b; +         tc->swizzle_a = view->swizzle_a; +         tc->format = view->format; +      } +        /* mark as entries as invalid/empty */        /* XXX we should try to avoid this when the teximage hasn't changed */        for (i = 0; i < NUM_ENTRIES; i++) { @@ -204,7 +208,6 @@ const struct softpipe_tex_cached_tile *  sp_find_cached_tile_tex(struct softpipe_tex_tile_cache *tc,                           union tex_tile_address addr )  { -   struct pipe_screen *screen = tc->screen;     struct softpipe_tex_cached_tile *tile;     tile = tc->entries + tex_cache_pos( addr ); @@ -232,24 +235,25 @@ sp_find_cached_tile_tex(struct softpipe_tex_tile_cache *tc,           if (tc->tex_trans) {              if (tc->tex_trans_map) { -               tc->screen->transfer_unmap(tc->screen, tc->tex_trans); +               tc->pipe->transfer_unmap(tc->pipe, tc->tex_trans);                 tc->tex_trans_map = NULL;              } -            screen->tex_transfer_destroy(tc->tex_trans); +            tc->pipe->transfer_destroy(tc->pipe, tc->tex_trans);              tc->tex_trans = NULL;           }           tc->tex_trans =  -            screen->get_tex_transfer(screen, tc->texture,  -                                     addr.bits.face,  -                                     addr.bits.level,  -                                     addr.bits.z,  -                                     PIPE_TRANSFER_READ, 0, 0, -                                     u_minify(tc->texture->width0, addr.bits.level), -                                     u_minify(tc->texture->height0, addr.bits.level)); +            pipe_get_transfer(tc->pipe, tc->texture,  +			      addr.bits.face,  +			      addr.bits.level,  +			      addr.bits.z,  +			      PIPE_TRANSFER_READ | PIPE_TRANSFER_UNSYNCHRONIZED, +			      0, 0, +			      u_minify(tc->texture->width0, addr.bits.level), +			      u_minify(tc->texture->height0, addr.bits.level)); -         tc->tex_trans_map = screen->transfer_map(screen, tc->tex_trans); +         tc->tex_trans_map = tc->pipe->transfer_map(tc->pipe, tc->tex_trans);           tc->tex_face = addr.bits.face;           tc->tex_level = addr.bits.level; @@ -257,11 +261,18 @@ sp_find_cached_tile_tex(struct softpipe_tex_tile_cache *tc,        }        /* get tile from the transfer (view into texture) */ -      pipe_get_tile_rgba(tc->tex_trans, -                         addr.bits.x * TILE_SIZE,  -                         addr.bits.y * TILE_SIZE, -                         TILE_SIZE, TILE_SIZE, -                         (float *) tile->data.color); +      pipe_get_tile_swizzle(tc->pipe, +			    tc->tex_trans, +                            addr.bits.x * TILE_SIZE,  +                            addr.bits.y * TILE_SIZE, +                            TILE_SIZE, +                            TILE_SIZE, +                            tc->swizzle_r, +                            tc->swizzle_g, +                            tc->swizzle_b, +                            tc->swizzle_a, +                            tc->format, +                            (float *) tile->data.color);        tile->addr = addr;     } diff --git a/src/gallium/drivers/softpipe/sp_tex_tile_cache.h b/src/gallium/drivers/softpipe/sp_tex_tile_cache.h index ac6886a3df..0794ffa0c5 100644 --- a/src/gallium/drivers/softpipe/sp_tex_tile_cache.h +++ b/src/gallium/drivers/softpipe/sp_tex_tile_cache.h @@ -70,11 +70,11 @@ struct softpipe_tex_cached_tile  struct softpipe_tex_tile_cache  { -   struct pipe_screen *screen; +   struct pipe_context *pipe;     struct pipe_transfer *transfer;     void *transfer_map; -   struct pipe_texture *texture;  /**< if caching a texture */ +   struct pipe_resource *texture;  /**< if caching a texture */     unsigned timestamp;     struct softpipe_tex_cached_tile entries[NUM_ENTRIES]; @@ -83,12 +83,18 @@ struct softpipe_tex_tile_cache     void *tex_trans_map;     int tex_face, tex_level, tex_z; +   unsigned swizzle_r; +   unsigned swizzle_g; +   unsigned swizzle_b; +   unsigned swizzle_a; +   unsigned format; +     struct softpipe_tex_cached_tile *last_tile;  /**< most recently retrieved tile */  };  extern struct softpipe_tex_tile_cache * -sp_create_tex_tile_cache( struct pipe_screen *screen ); +sp_create_tex_tile_cache( struct pipe_context *pipe );  extern void  sp_destroy_tex_tile_cache(struct softpipe_tex_tile_cache *tc); @@ -101,8 +107,8 @@ extern void  sp_tex_tile_cache_unmap_transfers(struct softpipe_tex_tile_cache *tc);  extern void -sp_tex_tile_cache_set_texture(struct softpipe_tex_tile_cache *tc, -                          struct pipe_texture *texture); +sp_tex_tile_cache_set_sampler_view(struct softpipe_tex_tile_cache *tc, +                                   struct pipe_sampler_view *view);  void  sp_tex_tile_cache_validate_texture(struct softpipe_tex_tile_cache *tc); diff --git a/src/gallium/drivers/softpipe/sp_texture.c b/src/gallium/drivers/softpipe/sp_texture.c index 32d261b5ff..3533c4fd4f 100644 --- a/src/gallium/drivers/softpipe/sp_texture.c +++ b/src/gallium/drivers/softpipe/sp_texture.c @@ -36,11 +36,14 @@  #include "util/u_format.h"  #include "util/u_math.h"  #include "util/u_memory.h" +#include "util/u_transfer.h"  #include "sp_context.h" +#include "sp_flush.h"  #include "sp_texture.h"  #include "sp_screen.h" -#include "sp_winsys.h" + +#include "state_tracker/sw_winsys.h"  /** @@ -48,10 +51,10 @@   * Use a simple, maximally packed layout.   */  static boolean -softpipe_texture_layout(struct pipe_screen *screen, -                        struct softpipe_texture * spt) +softpipe_resource_layout(struct pipe_screen *screen, +                         struct softpipe_resource *spr)  { -   struct pipe_texture *pt = &spt->base; +   struct pipe_resource *pt = &spr->base;     unsigned level;     unsigned width = pt->width0;     unsigned height = pt->height0; @@ -59,24 +62,22 @@ softpipe_texture_layout(struct pipe_screen *screen,     unsigned buffer_size = 0;     for (level = 0; level <= pt->last_level; level++) { -      spt->stride[level] = util_format_get_stride(pt->format, width); +      spr->stride[level] = util_format_get_stride(pt->format, width); -      spt->level_offset[level] = buffer_size; +      spr->level_offset[level] = buffer_size;        buffer_size += (util_format_get_nblocksy(pt->format, height) *                        ((pt->target == PIPE_TEXTURE_CUBE) ? 6 : depth) * -                      spt->stride[level]); +                      spr->stride[level]);        width  = u_minify(width, 1);        height = u_minify(height, 1);        depth = u_minify(depth, 1);     } -   spt->buffer = screen->buffer_create(screen, 32, -                                       PIPE_BUFFER_USAGE_PIXEL, -                                       buffer_size); +   spr->data = align_malloc(buffer_size, 16); -   return spt->buffer != NULL; +   return spr->data != NULL;  } @@ -85,115 +86,144 @@ softpipe_texture_layout(struct pipe_screen *screen,   */  static boolean  softpipe_displaytarget_layout(struct pipe_screen *screen, -                              struct softpipe_texture * spt) +                              struct softpipe_resource *spr)  { -   unsigned usage = (PIPE_BUFFER_USAGE_CPU_READ_WRITE | -                     PIPE_BUFFER_USAGE_GPU_READ_WRITE); -   unsigned tex_usage = spt->base.tex_usage; +   struct sw_winsys *winsys = softpipe_screen(screen)->winsys; -   spt->buffer = screen->surface_buffer_create( screen,  -                                                spt->base.width0,  -                                                spt->base.height0, -                                                spt->base.format, -                                                usage, -                                                tex_usage, -                                                &spt->stride[0]); +   /* Round up the surface size to a multiple of the tile size? +    */ +   spr->dt = winsys->displaytarget_create(winsys, +                                          spr->base.bind, +                                          spr->base.format, +                                          spr->base.width0,  +                                          spr->base.height0, +                                          16, +                                          &spr->stride[0] ); -   return spt->buffer != NULL; +   return spr->dt != NULL;  }  /** - * Create new pipe_texture given the template information. + * Create new pipe_resource given the template information.   */ -static struct pipe_texture * -softpipe_texture_create(struct pipe_screen *screen, -                        const struct pipe_texture *template) +static struct pipe_resource * +softpipe_resource_create(struct pipe_screen *screen, +                         const struct pipe_resource *templat)  { -   struct softpipe_texture *spt = CALLOC_STRUCT(softpipe_texture); -   if (!spt) +   struct softpipe_resource *spr = CALLOC_STRUCT(softpipe_resource); +   if (!spr)        return NULL; -   spt->base = *template; -   pipe_reference_init(&spt->base.reference, 1); -   spt->base.screen = screen; +   assert(templat->format != PIPE_FORMAT_NONE); + +   spr->base = *templat; +   pipe_reference_init(&spr->base.reference, 1); +   spr->base.screen = screen; -   spt->pot = (util_is_power_of_two(template->width0) && -               util_is_power_of_two(template->height0) && -               util_is_power_of_two(template->depth0)); +   spr->pot = (util_is_power_of_two(templat->width0) && +               util_is_power_of_two(templat->height0) && +               util_is_power_of_two(templat->depth0)); -   if (spt->base.tex_usage & (PIPE_TEXTURE_USAGE_DISPLAY_TARGET | -                              PIPE_TEXTURE_USAGE_PRIMARY)) { -      if (!softpipe_displaytarget_layout(screen, spt)) +   if (spr->base.bind & (PIPE_BIND_DISPLAY_TARGET | +			 PIPE_BIND_SCANOUT | +			 PIPE_BIND_SHARED)) { +      if (!softpipe_displaytarget_layout(screen, spr))           goto fail;     }     else { -      if (!softpipe_texture_layout(screen, spt)) +      if (!softpipe_resource_layout(screen, spr))           goto fail;     } -   return &spt->base; +   return &spr->base;   fail: -   FREE(spt); +   FREE(spr);     return NULL;  } -/** - * Create a new pipe_texture which wraps an existing buffer. - */ -static struct pipe_texture * -softpipe_texture_blanket(struct pipe_screen * screen, -                         const struct pipe_texture *base, -                         const unsigned *stride, -                         struct pipe_buffer *buffer) +static void +softpipe_resource_destroy(struct pipe_screen *pscreen, +			  struct pipe_resource *pt)  { -   struct softpipe_texture *spt; -   assert(screen); +   struct softpipe_screen *screen = softpipe_screen(pscreen); +   struct softpipe_resource *spr = softpipe_resource(pt); -   /* Only supports one type */ -   if (base->target != PIPE_TEXTURE_2D || -       base->last_level != 0 || -       base->depth0 != 1) { -      return NULL; +   if (spr->dt) { +      /* display target */ +      struct sw_winsys *winsys = screen->winsys; +      winsys->displaytarget_destroy(winsys, spr->dt);     } +   else if (!spr->userBuffer) { +      /* regular texture */ +      align_free(spr->data); +   } + +   FREE(spr); +} + -   spt = CALLOC_STRUCT(softpipe_texture); -   if (!spt) +static struct pipe_resource * +softpipe_resource_from_handle(struct pipe_screen *screen, +                              const struct pipe_resource *templat, +                              struct winsys_handle *whandle) +{ +   struct sw_winsys *winsys = softpipe_screen(screen)->winsys; +   struct softpipe_resource *spr = CALLOC_STRUCT(softpipe_resource); +   if (!spr)        return NULL; -   spt->base = *base; -   pipe_reference_init(&spt->base.reference, 1); -   spt->base.screen = screen; -   spt->stride[0] = stride[0]; +   spr->base = *templat; +   pipe_reference_init(&spr->base.reference, 1); +   spr->base.screen = screen; + +   spr->pot = (util_is_power_of_two(templat->width0) && +               util_is_power_of_two(templat->height0) && +               util_is_power_of_two(templat->depth0)); + +   spr->dt = winsys->displaytarget_from_handle(winsys, +                                               templat, +                                               whandle, +                                               &spr->stride[0]); +   if (!spr->dt) +      goto fail; -   pipe_buffer_reference(&spt->buffer, buffer); +   return &spr->base; -   return &spt->base; + fail: +   FREE(spr); +   return NULL;  } -static void -softpipe_texture_destroy(struct pipe_texture *pt) +static boolean +softpipe_resource_get_handle(struct pipe_screen *screen, +                             struct pipe_resource *pt, +                             struct winsys_handle *whandle)  { -   struct softpipe_texture *spt = softpipe_texture(pt); +   struct sw_winsys *winsys = softpipe_screen(screen)->winsys; +   struct softpipe_resource *spr = softpipe_resource(pt); -   pipe_buffer_reference(&spt->buffer, NULL); -   FREE(spt); +   assert(spr->dt); +   if (!spr->dt) +      return FALSE; + +   return winsys->displaytarget_get_handle(winsys, spr->dt, whandle);  }  /** - * Get a pipe_surface "view" into a texture. + * Get a pipe_surface "view" into a texture resource.   */  static struct pipe_surface *  softpipe_get_tex_surface(struct pipe_screen *screen, -                         struct pipe_texture *pt, +                         struct pipe_resource *pt,                           unsigned face, unsigned level, unsigned zslice,                           unsigned usage)  { -   struct softpipe_texture *spt = softpipe_texture(pt); +   struct softpipe_resource *spr = softpipe_resource(pt);     struct pipe_surface *ps;     assert(level <= pt->last_level); @@ -201,44 +231,24 @@ softpipe_get_tex_surface(struct pipe_screen *screen,     ps = CALLOC_STRUCT(pipe_surface);     if (ps) {        pipe_reference_init(&ps->reference, 1); -      pipe_texture_reference(&ps->texture, pt); +      pipe_resource_reference(&ps->texture, pt);        ps->format = pt->format;        ps->width = u_minify(pt->width0, level);        ps->height = u_minify(pt->height0, level); -      ps->offset = spt->level_offset[level]; +      ps->offset = spr->level_offset[level];        ps->usage = usage; -      /* Because we are softpipe, anything that the state tracker -       * thought was going to be done with the GPU will actually get -       * done with the CPU.  Let's adjust the flags to take that into -       * account. -       */ -      if (ps->usage & PIPE_BUFFER_USAGE_GPU_WRITE) { -         /* GPU_WRITE means "render" and that can involve reads (blending) */ -         ps->usage |= PIPE_BUFFER_USAGE_CPU_WRITE | PIPE_BUFFER_USAGE_CPU_READ; -      } - -      if (ps->usage & PIPE_BUFFER_USAGE_GPU_READ) -         ps->usage |= PIPE_BUFFER_USAGE_CPU_READ; - -      if (ps->usage & (PIPE_BUFFER_USAGE_CPU_WRITE | -                       PIPE_BUFFER_USAGE_GPU_WRITE)) { -         /* Mark the surface as dirty.  The tile cache will look for this. */ -         spt->timestamp++; -         softpipe_screen(screen)->timestamp++; -      } -        ps->face = face;        ps->level = level;        ps->zslice = zslice;        if (pt->target == PIPE_TEXTURE_CUBE) {           ps->offset += face * util_format_get_nblocksy(pt->format, u_minify(pt->height0, level)) * -                       spt->stride[level]; +                       spr->stride[level];        }        else if (pt->target == PIPE_TEXTURE_3D) {           ps->offset += zslice * util_format_get_nblocksy(pt->format, u_minify(pt->height0, level)) * -                       spt->stride[level]; +                       spr->stride[level];        }        else {           assert(face == 0); @@ -260,67 +270,88 @@ softpipe_tex_surface_destroy(struct pipe_surface *surf)      * where it would happen.  For softpipe, nothing to do.      */     assert(surf->texture); -   pipe_texture_reference(&surf->texture, NULL); +   pipe_resource_reference(&surf->texture, NULL);     FREE(surf);  }  /**   * Geta pipe_transfer object which is used for moving data in/out of - * a texture object. - * \param face  one of PIPE_TEX_FACE_x or 0 - * \param level  texture mipmap level - * \param zslice  2D slice of a 3D texture - * \param usage  one of PIPE_TRANSFER_READ/WRITE/READ_WRITE - * \param x  X position of region to read/write - * \param y  Y position of region to read/write - * \param width  width of region to read/write - * \param height  height of region to read/write + * a resource object. + * \param pipe  rendering context + * \param resource  the resource to transfer in/out of + * \param sr  indicates cube face or 3D texture slice + * \param usage  bitmask of PIPE_TRANSFER_x flags + * \param box  the 1D/2D/3D region of interest   */  static struct pipe_transfer * -softpipe_get_tex_transfer(struct pipe_screen *screen, -                          struct pipe_texture *texture, -                          unsigned face, unsigned level, unsigned zslice, -                          enum pipe_transfer_usage usage, -                          unsigned x, unsigned y, unsigned w, unsigned h) +softpipe_get_transfer(struct pipe_context *pipe, +		      struct pipe_resource *resource, +		      struct pipe_subresource sr, +		      unsigned usage, +		      const struct pipe_box *box)  { -   struct softpipe_texture *sptex = softpipe_texture(texture); -   struct softpipe_transfer *spt; +   struct softpipe_resource *sprex = softpipe_resource(resource); +   struct softpipe_transfer *spr; -   assert(texture); -   assert(level <= texture->last_level); +   assert(resource); +   assert(sr.level <= resource->last_level);     /* make sure the requested region is in the image bounds */ -   assert(x + w <= u_minify(texture->width0, level)); -   assert(y + h <= u_minify(texture->height0, level)); +   assert(box->x + box->width <= u_minify(resource->width0, sr.level)); +   assert(box->y + box->height <= u_minify(resource->height0, sr.level)); +   assert(box->z + box->depth <= u_minify(resource->depth0, sr.level)); -   spt = CALLOC_STRUCT(softpipe_transfer); -   if (spt) { -      struct pipe_transfer *pt = &spt->base; -      int nblocksy = util_format_get_nblocksy(texture->format, u_minify(texture->height0, level)); -      pipe_texture_reference(&pt->texture, texture); -      pt->x = x; -      pt->y = y; -      pt->width = w; -      pt->height = h; -      pt->stride = sptex->stride[level]; +   /* +    * Transfers, like other pipe operations, must happen in order, so flush the +    * context if necessary. +    */ +   if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) { +      boolean read_only = !(usage & PIPE_TRANSFER_WRITE); +      boolean do_not_block = !!(usage & PIPE_TRANSFER_DONTBLOCK); +      if (!softpipe_flush_resource(pipe, resource, +                                   sr.face, sr.level, +                                   0, /* flush_flags */ +                                   read_only, +                                   TRUE, /* cpu_access */ +                                   do_not_block)) { +         /* +          * It would have blocked, but state tracker requested no to. +          */ +         assert(do_not_block); +         return NULL; +      } +   } + +   spr = CALLOC_STRUCT(softpipe_transfer); +   if (spr) { +      struct pipe_transfer *pt = &spr->base; +      enum pipe_format format = resource->format; +      int nblocksy = util_format_get_nblocksy(resource->format,  +					      u_minify(resource->height0, sr.level)); +      pipe_resource_reference(&pt->resource, resource); +      pt->sr = sr;        pt->usage = usage; -      pt->face = face; -      pt->level = level; -      pt->zslice = zslice; +      pt->box = *box; +      pt->stride = sprex->stride[sr.level]; -      spt->offset = sptex->level_offset[level]; +      spr->offset = sprex->level_offset[sr.level]; -      if (texture->target == PIPE_TEXTURE_CUBE) { -         spt->offset += face * nblocksy * pt->stride; +      if (resource->target == PIPE_TEXTURE_CUBE) { +         spr->offset += sr.face * nblocksy * pt->stride;        } -      else if (texture->target == PIPE_TEXTURE_3D) { -         spt->offset += zslice * nblocksy * pt->stride; +      else if (resource->target == PIPE_TEXTURE_3D) { +         spr->offset += box->z * nblocksy * pt->stride;        }        else { -         assert(face == 0); -         assert(zslice == 0); +         assert(sr.face == 0); +         assert(box->z == 0);        } +       +      spr->offset +=  +	 box->y / util_format_get_blockheight(format) * spr->base.stride + +	 box->x / util_format_get_blockwidth(format) * util_format_get_blocksize(format); +        return pt;     }     return NULL; @@ -329,17 +360,13 @@ softpipe_get_tex_transfer(struct pipe_screen *screen,  /**   * Free a pipe_transfer object which was created with - * softpipe_get_tex_transfer(). + * softpipe_get_transfer().   */  static void  -softpipe_tex_transfer_destroy(struct pipe_transfer *transfer) +softpipe_transfer_destroy(struct pipe_context *pipe, +                          struct pipe_transfer *transfer)  { -   /* Effectively do the texture_update work here - if texture images -    * needed post-processing to put them into hardware layout, this is -    * where it would happen.  For softpipe, nothing to do. -    */ -   assert (transfer->texture); -   pipe_texture_reference(&transfer->texture, NULL); +   pipe_resource_reference(&transfer->resource, NULL);     FREE(transfer);  } @@ -348,36 +375,29 @@ softpipe_tex_transfer_destroy(struct pipe_transfer *transfer)   * Create memory mapping for given pipe_transfer object.   */  static void * -softpipe_transfer_map( struct pipe_screen *screen, -                       struct pipe_transfer *transfer ) +softpipe_transfer_map(struct pipe_context *pipe, +                      struct pipe_transfer *transfer)  { -   ubyte *map, *xfer_map; -   struct softpipe_texture *spt; -   enum pipe_format format; - -   assert(transfer->texture); -   spt = softpipe_texture(transfer->texture); -   format = transfer->texture->format; - -   map = pipe_buffer_map(screen, spt->buffer, pipe_transfer_buffer_flags(transfer)); -   if (map == NULL) -      return NULL; - -   /* May want to different things here depending on read/write nature -    * of the map: +   struct softpipe_transfer *sp_transfer = softpipe_transfer(transfer); +   struct softpipe_resource *sp_resource = softpipe_resource(transfer->resource); +   struct sw_winsys *winsys = softpipe_screen(pipe->screen)->winsys; +   uint8_t *map; +    +   /* resources backed by display target treated specially:      */ -   if (transfer->texture && (transfer->usage & PIPE_TRANSFER_WRITE)) { -      /* Do something to notify sharing contexts of a texture change. -       * In softpipe, that would mean flushing the texture cache. -       */ -      softpipe_screen(screen)->timestamp++; +   if (sp_resource->dt) { +      map = winsys->displaytarget_map(winsys, +				      sp_resource->dt, +                                      transfer->usage); +   } +   else { +      map = sp_resource->data;     } -   xfer_map = map + softpipe_transfer(transfer)->offset + -      transfer->y / util_format_get_blockheight(format) * transfer->stride + -      transfer->x / util_format_get_blockwidth(format) * util_format_get_blocksize(format); -   /*printf("map = %p  xfer map = %p\n", map, xfer_map);*/ -   return xfer_map; +   if (map == NULL) +      return NULL; +   else +      return map + sp_transfer->offset;  } @@ -385,113 +405,80 @@ softpipe_transfer_map( struct pipe_screen *screen,   * Unmap memory mapping for given pipe_transfer object.   */  static void -softpipe_transfer_unmap(struct pipe_screen *screen, +softpipe_transfer_unmap(struct pipe_context *pipe,                          struct pipe_transfer *transfer)  { -   struct softpipe_texture *spt; +   struct softpipe_resource *spr; -   assert(transfer->texture); -   spt = softpipe_texture(transfer->texture); +   assert(transfer->resource); +   spr = softpipe_resource(transfer->resource); -   pipe_buffer_unmap( screen, spt->buffer ); +   if (spr->dt) { +      /* display target */ +      struct sw_winsys *winsys = softpipe_screen(pipe->screen)->winsys; +      winsys->displaytarget_unmap(winsys, spr->dt); +   }     if (transfer->usage & PIPE_TRANSFER_WRITE) {        /* Mark the texture as dirty to expire the tile caches. */ -      spt->timestamp++; +      spr->timestamp++;     }  } - -static struct pipe_video_surface* -softpipe_video_surface_create(struct pipe_screen *screen, -                              enum pipe_video_chroma_format chroma_format, -                              unsigned width, unsigned height) +/** + * Create buffer which wraps user-space data. + */ +static struct pipe_resource * +softpipe_user_buffer_create(struct pipe_screen *screen, +                            void *ptr, +                            unsigned bytes, +			    unsigned bind_flags)  { -   struct softpipe_video_surface *sp_vsfc; -   struct pipe_texture template; - -   assert(screen); -   assert(width && height); +   struct softpipe_resource *buffer; -   sp_vsfc = CALLOC_STRUCT(softpipe_video_surface); -   if (!sp_vsfc) +   buffer = CALLOC_STRUCT(softpipe_resource); +   if(!buffer)        return NULL; -   pipe_reference_init(&sp_vsfc->base.reference, 1); -   sp_vsfc->base.screen = screen; -   sp_vsfc->base.chroma_format = chroma_format; -   /*sp_vsfc->base.surface_format = PIPE_VIDEO_SURFACE_FORMAT_VUYA;*/ -   sp_vsfc->base.width = width; -   sp_vsfc->base.height = height; - -   memset(&template, 0, sizeof(struct pipe_texture)); -   template.target = PIPE_TEXTURE_2D; -   template.format = PIPE_FORMAT_B8G8R8X8_UNORM; -   template.last_level = 0; -   /* vl_mpeg12_mc_renderer expects this when it's initialized with pot_buffers=true */ -   template.width0 = util_next_power_of_two(width); -   template.height0 = util_next_power_of_two(height); -   template.depth0 = 1; -   template.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER | PIPE_TEXTURE_USAGE_RENDER_TARGET; - -   sp_vsfc->tex = screen->texture_create(screen, &template); -   if (!sp_vsfc->tex) { -      FREE(sp_vsfc); -      return NULL; -   } +    +   pipe_reference_init(&buffer->base.reference, 1); +   buffer->base.screen = screen; +   buffer->base.format = PIPE_FORMAT_R8_UNORM; /* ?? */ +   buffer->base.bind = bind_flags; +   buffer->base.usage = PIPE_USAGE_IMMUTABLE; +   buffer->base.flags = 0; +   buffer->base.width0 = bytes; +   buffer->base.height0 = 1; +   buffer->base.depth0 = 1; +   buffer->userBuffer = TRUE; +   buffer->data = ptr; -   return &sp_vsfc->base; +   return &buffer->base;  } -static void -softpipe_video_surface_destroy(struct pipe_video_surface *vsfc) +void +softpipe_init_texture_funcs(struct pipe_context *pipe)  { -   struct softpipe_video_surface *sp_vsfc = softpipe_video_surface(vsfc); +   pipe->get_transfer = softpipe_get_transfer; +   pipe->transfer_destroy = softpipe_transfer_destroy; +   pipe->transfer_map = softpipe_transfer_map; +   pipe->transfer_unmap = softpipe_transfer_unmap; -   pipe_texture_reference(&sp_vsfc->tex, NULL); -   FREE(sp_vsfc); +   pipe->transfer_flush_region = u_default_transfer_flush_region; +   pipe->transfer_inline_write = u_default_transfer_inline_write;  }  void  softpipe_init_screen_texture_funcs(struct pipe_screen *screen)  { -   screen->texture_create = softpipe_texture_create; -   screen->texture_blanket = softpipe_texture_blanket; -   screen->texture_destroy = softpipe_texture_destroy; +   screen->resource_create = softpipe_resource_create; +   screen->resource_destroy = softpipe_resource_destroy; +   screen->resource_from_handle = softpipe_resource_from_handle; +   screen->resource_get_handle = softpipe_resource_get_handle; +   screen->user_buffer_create = softpipe_user_buffer_create;     screen->get_tex_surface = softpipe_get_tex_surface;     screen->tex_surface_destroy = softpipe_tex_surface_destroy; - -   screen->get_tex_transfer = softpipe_get_tex_transfer; -   screen->tex_transfer_destroy = softpipe_tex_transfer_destroy; -   screen->transfer_map = softpipe_transfer_map; -   screen->transfer_unmap = softpipe_transfer_unmap; - -   screen->video_surface_create = softpipe_video_surface_create; -   screen->video_surface_destroy = softpipe_video_surface_destroy; -} - - -/** - * Return pipe_buffer handle and stride for given texture object. - * XXX used for??? - */ -boolean -softpipe_get_texture_buffer( struct pipe_texture *texture, -                             struct pipe_buffer **buf, -                             unsigned *stride ) -{ -   struct softpipe_texture *tex = (struct softpipe_texture *) texture; - -   if (!tex) -      return FALSE; - -   pipe_buffer_reference(buf, tex->buffer); - -   if (stride) -      *stride = tex->stride[0]; - -   return TRUE;  } diff --git a/src/gallium/drivers/softpipe/sp_texture.h b/src/gallium/drivers/softpipe/sp_texture.h index 2ef64e1e7c..6b205dc532 100644 --- a/src/gallium/drivers/softpipe/sp_texture.h +++ b/src/gallium/drivers/softpipe/sp_texture.h @@ -30,7 +30,10 @@  #include "pipe/p_state.h" -#include "pipe/p_video_state.h" + + +#define SP_MAX_TEXTURE_2D_LEVELS 13  /* 4K x 4K */ +#define SP_MAX_TEXTURE_3D_LEVELS 9   /* 512 x 512 x 512 */  struct pipe_context; @@ -38,24 +41,39 @@ struct pipe_screen;  struct softpipe_context; -struct softpipe_texture +/** + * Subclass of pipe_resource. + */ +struct softpipe_resource  { -   struct pipe_texture base; +   struct pipe_resource base; -   unsigned long level_offset[PIPE_MAX_TEXTURE_LEVELS]; -   unsigned stride[PIPE_MAX_TEXTURE_LEVELS]; +   unsigned long level_offset[SP_MAX_TEXTURE_2D_LEVELS]; +   unsigned stride[SP_MAX_TEXTURE_2D_LEVELS]; + +   /** +    * Display target, only valid for PIPE_TEXTURE_2D with the +    * PIPE_BIND_DISPLAY_TARGET usage. +    */ +   struct sw_displaytarget *dt; -   /* The data is held here: +   /** +    * Malloc'ed data for regular buffers and textures, or a mapping to dt above.      */ -   struct pipe_buffer *buffer; +   void *data;     /* True if texture images are power-of-two in all dimensions:      */     boolean pot; +   boolean userBuffer;     unsigned timestamp;  }; + +/** + * Subclass of pipe_transfer. + */  struct softpipe_transfer  {     struct pipe_transfer base; @@ -63,21 +81,13 @@ struct softpipe_transfer     unsigned long offset;  }; -struct softpipe_video_surface -{ -   struct pipe_video_surface base; - -   /* The data is held here: -    */ -   struct pipe_texture *tex; -};  /** cast wrappers */ -static INLINE struct softpipe_texture * -softpipe_texture(struct pipe_texture *pt) +static INLINE struct softpipe_resource * +softpipe_resource(struct pipe_resource *pt)  { -   return (struct softpipe_texture *) pt; +   return (struct softpipe_resource *) pt;  }  static INLINE struct softpipe_transfer * @@ -86,15 +96,12 @@ softpipe_transfer(struct pipe_transfer *pt)     return (struct softpipe_transfer *) pt;  } -static INLINE struct softpipe_video_surface * -softpipe_video_surface(struct pipe_video_surface *pvs) -{ -   return (struct softpipe_video_surface *) pvs; -} -  extern void  softpipe_init_screen_texture_funcs(struct pipe_screen *screen); +extern void +softpipe_init_texture_funcs(struct pipe_context *pipe); +  #endif /* SP_TEXTURE */ diff --git a/src/gallium/drivers/softpipe/sp_tile_cache.c b/src/gallium/drivers/softpipe/sp_tile_cache.c index aedfdf1b46..f4db6f6ef0 100644 --- a/src/gallium/drivers/softpipe/sp_tile_cache.c +++ b/src/gallium/drivers/softpipe/sp_tile_cache.c @@ -79,20 +79,20 @@ clear_clear_flag(uint *bitvec, union tile_address addr)  struct softpipe_tile_cache * -sp_create_tile_cache( struct pipe_screen *screen ) +sp_create_tile_cache( struct pipe_context *pipe )  {     struct softpipe_tile_cache *tc;     uint pos;     int maxLevels, maxTexSize;     /* sanity checking: max sure MAX_WIDTH/HEIGHT >= largest texture image */ -   maxLevels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS); +   maxLevels = pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);     maxTexSize = 1 << (maxLevels - 1);     assert(MAX_WIDTH >= maxTexSize);     tc = CALLOC_STRUCT( softpipe_tile_cache );     if (tc) { -      tc->screen = screen; +      tc->pipe = pipe;        for (pos = 0; pos < NUM_ENTRIES; pos++) {           tc->entries[pos].addr.bits.invalid = 1;        } @@ -103,7 +103,7 @@ sp_create_tile_cache( struct pipe_screen *screen )         * However, it breaks clearing in other situations (such as in         * progs/tests/drawbuffers, see bug 24402).         */ -#if 0 && TILE_CLEAR_OPTIMIZATION +#if 0        /* set flags to indicate all the tiles are cleared */        memset(tc->clear_flags, 255, sizeof(tc->clear_flags));  #endif @@ -115,15 +115,13 @@ sp_create_tile_cache( struct pipe_screen *screen )  void  sp_destroy_tile_cache(struct softpipe_tile_cache *tc)  { -   struct pipe_screen *screen;     uint pos;     for (pos = 0; pos < NUM_ENTRIES; pos++) {        /*assert(tc->entries[pos].x < 0);*/     }     if (tc->transfer) { -      screen = tc->transfer->texture->screen; -      screen->tex_transfer_destroy(tc->transfer); +      tc->pipe->transfer_destroy(tc->pipe, tc->transfer);     }     FREE( tc ); @@ -137,38 +135,37 @@ void  sp_tile_cache_set_surface(struct softpipe_tile_cache *tc,                            struct pipe_surface *ps)  { -   if (tc->transfer) { -      struct pipe_screen *screen = tc->transfer->texture->screen; +   struct pipe_context *pipe = tc->pipe; +   if (tc->transfer) {        if (ps == tc->surface)           return;        if (tc->transfer_map) { -         screen->transfer_unmap(screen, tc->transfer); +         pipe->transfer_unmap(pipe, tc->transfer);           tc->transfer_map = NULL;        } -      screen->tex_transfer_destroy(tc->transfer); +      pipe->transfer_destroy(pipe, tc->transfer);        tc->transfer = NULL;     }     tc->surface = ps;     if (ps) { -      struct pipe_screen *screen = ps->texture->screen; - -      tc->transfer = screen->get_tex_transfer(screen, ps->texture, ps->face, -                                              ps->level, ps->zslice, -                                              PIPE_TRANSFER_READ_WRITE, -                                              0, 0, ps->width, ps->height); +      tc->transfer = pipe_get_transfer(pipe, ps->texture, ps->face, +					   ps->level, ps->zslice, +					   PIPE_TRANSFER_READ_WRITE | +					   PIPE_TRANSFER_UNSYNCHRONIZED, +					   0, 0, ps->width, ps->height); -      tc->depth_stencil = (ps->format == PIPE_FORMAT_Z24S8_UNORM || +      tc->depth_stencil = (ps->format == PIPE_FORMAT_Z24_UNORM_S8_USCALED ||                             ps->format == PIPE_FORMAT_Z24X8_UNORM || -                           ps->format == PIPE_FORMAT_S8Z24_UNORM || +                           ps->format == PIPE_FORMAT_S8_USCALED_Z24_UNORM ||                             ps->format == PIPE_FORMAT_X8Z24_UNORM ||                             ps->format == PIPE_FORMAT_Z16_UNORM ||                             ps->format == PIPE_FORMAT_Z32_UNORM || -                           ps->format == PIPE_FORMAT_S8_UNORM); +                           ps->format == PIPE_FORMAT_S8_USCALED);     }  } @@ -187,7 +184,7 @@ void  sp_tile_cache_map_transfers(struct softpipe_tile_cache *tc)  {     if (tc->transfer && !tc->transfer_map) -      tc->transfer_map = tc->screen->transfer_map(tc->screen, tc->transfer); +      tc->transfer_map = tc->pipe->transfer_map(tc->pipe, tc->transfer);  } @@ -195,7 +192,7 @@ void  sp_tile_cache_unmap_transfers(struct softpipe_tile_cache *tc)  {     if (tc->transfer_map) { -      tc->screen->transfer_unmap(tc->screen, tc->transfer); +      tc->pipe->transfer_unmap(tc->pipe, tc->transfer);        tc->transfer_map = NULL;     }  } @@ -280,14 +277,14 @@ static void  sp_tile_cache_flush_clear(struct softpipe_tile_cache *tc)  {     struct pipe_transfer *pt = tc->transfer; -   const uint w = tc->transfer->width; -   const uint h = tc->transfer->height; +   const uint w = tc->transfer->box.width; +   const uint h = tc->transfer->box.height;     uint x, y;     uint numCleared = 0; -   assert(pt->texture); +   assert(pt->resource);     /* clear the scratch tile to the clear value */ -   clear_tile(&tc->tile, pt->texture->format, tc->clear_val); +   clear_tile(&tc->tile, pt->resource->format, tc->clear_val);     /* push the tile to all positions marked as clear */     for (y = 0; y < h; y += TILE_SIZE) { @@ -295,7 +292,8 @@ sp_tile_cache_flush_clear(struct softpipe_tile_cache *tc)           union tile_address addr = tile_address(x, y);           if (is_clear_flag_set(tc->clear_flags, addr)) { -            pipe_put_tile_raw(pt, +            pipe_put_tile_raw(tc->pipe, +                              pt,                                x, y, TILE_SIZE, TILE_SIZE,                                tc->tile.data.color32, 0/*STRIDE*/); @@ -329,14 +327,14 @@ sp_flush_tile_cache(struct softpipe_tile_cache *tc)           struct softpipe_cached_tile *tile = tc->entries + pos;           if (!tile->addr.bits.invalid) {              if (tc->depth_stencil) { -               pipe_put_tile_raw(pt, +               pipe_put_tile_raw(tc->pipe, pt,                                   tile->addr.bits.x * TILE_SIZE,                                    tile->addr.bits.y * TILE_SIZE,                                    TILE_SIZE, TILE_SIZE,                                   tile->data.depth32, 0/*STRIDE*/);              }              else { -               pipe_put_tile_rgba(pt, +               pipe_put_tile_rgba(tc->pipe, pt,                                    tile->addr.bits.x * TILE_SIZE,                                     tile->addr.bits.y * TILE_SIZE,                                     TILE_SIZE, TILE_SIZE, @@ -347,9 +345,7 @@ sp_flush_tile_cache(struct softpipe_tile_cache *tc)           }        } -#if TILE_CLEAR_OPTIMIZATION        sp_tile_cache_flush_clear(tc); -#endif     }  #if 0 @@ -375,18 +371,18 @@ sp_find_cached_tile(struct softpipe_tile_cache *tc,     if (addr.value != tile->addr.value) { -      assert(pt->texture); +      assert(pt->resource);        if (tile->addr.bits.invalid == 0) {           /* put dirty tile back in framebuffer */           if (tc->depth_stencil) { -            pipe_put_tile_raw(pt, +            pipe_put_tile_raw(tc->pipe, pt,                                tile->addr.bits.x * TILE_SIZE,                                tile->addr.bits.y * TILE_SIZE,                                TILE_SIZE, TILE_SIZE,                                tile->data.depth32, 0/*STRIDE*/);           }           else { -            pipe_put_tile_rgba(pt, +            pipe_put_tile_rgba(tc->pipe, pt,                                 tile->addr.bits.x * TILE_SIZE,                                 tile->addr.bits.y * TILE_SIZE,                                 TILE_SIZE, TILE_SIZE, @@ -399,24 +395,24 @@ sp_find_cached_tile(struct softpipe_tile_cache *tc,        if (is_clear_flag_set(tc->clear_flags, addr)) {           /* don't get tile from framebuffer, just clear it */           if (tc->depth_stencil) { -            clear_tile(tile, pt->texture->format, tc->clear_val); +            clear_tile(tile, pt->resource->format, tc->clear_val);           }           else { -            clear_tile_rgba(tile, pt->texture->format, tc->clear_color); +            clear_tile_rgba(tile, pt->resource->format, tc->clear_color);           }           clear_clear_flag(tc->clear_flags, addr);        }        else {           /* get new tile data from transfer */           if (tc->depth_stencil) { -            pipe_get_tile_raw(pt, +            pipe_get_tile_raw(tc->pipe, pt,                                tile->addr.bits.x * TILE_SIZE,                                 tile->addr.bits.y * TILE_SIZE,                                 TILE_SIZE, TILE_SIZE,                                tile->data.depth32, 0/*STRIDE*/);           }           else { -            pipe_get_tile_rgba(pt, +            pipe_get_tile_rgba(tc->pipe, pt,                                 tile->addr.bits.x * TILE_SIZE,                                  tile->addr.bits.y * TILE_SIZE,                                 TILE_SIZE, TILE_SIZE, @@ -451,13 +447,8 @@ sp_tile_cache_clear(struct softpipe_tile_cache *tc, const float *rgba,     tc->clear_val = clearValue; -#if TILE_CLEAR_OPTIMIZATION     /* set flags to indicate all the tiles are cleared */     memset(tc->clear_flags, 255, sizeof(tc->clear_flags)); -#else -   /* disable the optimization */ -   memset(tc->clear_flags, 0, sizeof(tc->clear_flags)); -#endif     for (pos = 0; pos < NUM_ENTRIES; pos++) {        struct softpipe_cached_tile *tile = tc->entries + pos; diff --git a/src/gallium/drivers/softpipe/sp_tile_cache.h b/src/gallium/drivers/softpipe/sp_tile_cache.h index a12092702a..e03d53eb24 100644 --- a/src/gallium/drivers/softpipe/sp_tile_cache.h +++ b/src/gallium/drivers/softpipe/sp_tile_cache.h @@ -28,8 +28,6 @@  #ifndef SP_TILE_CACHE_H  #define SP_TILE_CACHE_H -#define TILE_CLEAR_OPTIMIZATION 1 -  #include "pipe/p_compiler.h" @@ -80,7 +78,7 @@ struct softpipe_cached_tile  struct softpipe_tile_cache  { -   struct pipe_screen *screen; +   struct pipe_context *pipe;     struct pipe_surface *surface;  /**< the surface we're caching */     struct pipe_transfer *transfer;     void *transfer_map; @@ -98,7 +96,7 @@ struct softpipe_tile_cache  extern struct softpipe_tile_cache * -sp_create_tile_cache( struct pipe_screen *screen ); +sp_create_tile_cache( struct pipe_context *pipe );  extern void  sp_destroy_tile_cache(struct softpipe_tile_cache *tc); diff --git a/src/gallium/drivers/softpipe/sp_video_context.c b/src/gallium/drivers/softpipe/sp_video_context.c deleted file mode 100644 index 242aaac466..0000000000 --- a/src/gallium/drivers/softpipe/sp_video_context.c +++ /dev/null @@ -1,304 +0,0 @@ -/************************************************************************** - *  - * Copyright 2009 Younes Manton. - * All Rights Reserved. - *  - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - *  - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - *  - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *  - **************************************************************************/ - -#include "util/u_inlines.h" -#include "util/u_memory.h" - -#include "sp_video_context.h" -#include "sp_texture.h" - - -static void -sp_mpeg12_destroy(struct pipe_video_context *vpipe) -{ -   struct sp_mpeg12_context *ctx = (struct sp_mpeg12_context*)vpipe; - -   assert(vpipe); -	 -   /* Asserted in softpipe_delete_fs_state() for some reason */ -   ctx->pipe->bind_vs_state(ctx->pipe, NULL); -   ctx->pipe->bind_fs_state(ctx->pipe, NULL); - -   ctx->pipe->delete_blend_state(ctx->pipe, ctx->blend); -   ctx->pipe->delete_rasterizer_state(ctx->pipe, ctx->rast); -   ctx->pipe->delete_depth_stencil_alpha_state(ctx->pipe, ctx->dsa); - -   pipe_video_surface_reference(&ctx->decode_target, NULL); -   vl_compositor_cleanup(&ctx->compositor); -   vl_mpeg12_mc_renderer_cleanup(&ctx->mc_renderer); -   ctx->pipe->destroy(ctx->pipe); - -   FREE(ctx); -} - -static void -sp_mpeg12_decode_macroblocks(struct pipe_video_context *vpipe, -                             struct pipe_video_surface *past, -                             struct pipe_video_surface *future, -                             unsigned num_macroblocks, -                             struct pipe_macroblock *macroblocks, -                             struct pipe_fence_handle **fence) -{ -   struct sp_mpeg12_context *ctx = (struct sp_mpeg12_context*)vpipe; -   struct pipe_mpeg12_macroblock *mpeg12_macroblocks = (struct pipe_mpeg12_macroblock*)macroblocks; - -   assert(vpipe); -   assert(num_macroblocks); -   assert(macroblocks); -   assert(macroblocks->codec == PIPE_VIDEO_CODEC_MPEG12); -   assert(ctx->decode_target); - -   vl_mpeg12_mc_renderer_render_macroblocks(&ctx->mc_renderer, -                                            softpipe_video_surface(ctx->decode_target)->tex, -                                            past ? softpipe_video_surface(past)->tex : NULL, -                                            future ? softpipe_video_surface(future)->tex : NULL, -                                            num_macroblocks, mpeg12_macroblocks, fence); -} - -static void -sp_mpeg12_clear_surface(struct pipe_video_context *vpipe, -                        unsigned x, unsigned y, -                        unsigned width, unsigned height, -                        unsigned value, -                        struct pipe_surface *surface) -{ -   struct sp_mpeg12_context *ctx = (struct sp_mpeg12_context*)vpipe; - -   assert(vpipe); -   assert(surface); - -   ctx->pipe->surface_fill(ctx->pipe, surface, x, y, width, height, value); -} - -static void -sp_mpeg12_render_picture(struct pipe_video_context     *vpipe, -                         /*struct pipe_surface         *backround, -                         struct pipe_video_rect        *backround_area,*/ -                         struct pipe_video_surface     *src_surface, -                         enum pipe_mpeg12_picture_type picture_type, -                         /*unsigned                    num_past_surfaces, -                         struct pipe_video_surface     *past_surfaces, -                         unsigned                      num_future_surfaces, -                         struct pipe_video_surface     *future_surfaces,*/ -                         struct pipe_video_rect        *src_area, -                         struct pipe_surface           *dst_surface, -                         struct pipe_video_rect        *dst_area, -                         /*unsigned                      num_layers, -                         struct pipe_surface           *layers, -                         struct pipe_video_rect        *layer_src_areas, -                         struct pipe_video_rect        *layer_dst_areas*/ -                         struct pipe_fence_handle      **fence) -{ -   struct sp_mpeg12_context *ctx = (struct sp_mpeg12_context*)vpipe; -	 -   assert(vpipe); -   assert(src_surface); -   assert(src_area); -   assert(dst_surface); -   assert(dst_area); -	 -   vl_compositor_render(&ctx->compositor, softpipe_video_surface(src_surface)->tex, -                        picture_type, src_area, dst_surface->texture, dst_area, fence); -} - -static void -sp_mpeg12_set_decode_target(struct pipe_video_context *vpipe, -                            struct pipe_video_surface *dt) -{ -   struct sp_mpeg12_context *ctx = (struct sp_mpeg12_context*)vpipe; - -   assert(vpipe); -   assert(dt); - -   pipe_video_surface_reference(&ctx->decode_target, dt); -} - -static void sp_mpeg12_set_csc_matrix(struct pipe_video_context *vpipe, const float *mat) -{ -   struct sp_mpeg12_context *ctx = (struct sp_mpeg12_context*)vpipe; - -   assert(vpipe); - -   vl_compositor_set_csc_matrix(&ctx->compositor, mat); -} - -static bool -init_pipe_state(struct sp_mpeg12_context *ctx) -{ -   struct pipe_rasterizer_state rast; -   struct pipe_blend_state blend; -   struct pipe_depth_stencil_alpha_state dsa; -   unsigned i; - -   assert(ctx); -	 -   rast.flatshade = 1; -   rast.flatshade_first = 0; -   rast.light_twoside = 0; -   rast.front_winding = PIPE_WINDING_CCW; -   rast.cull_mode = PIPE_WINDING_CW; -   rast.fill_cw = PIPE_POLYGON_MODE_FILL; -   rast.fill_ccw = PIPE_POLYGON_MODE_FILL; -   rast.offset_cw = 0; -   rast.offset_ccw = 0; -   rast.scissor = 0; -   rast.poly_smooth = 0; -   rast.poly_stipple_enable = 0; -   rast.sprite_coord_enable = 0; -   rast.point_size_per_vertex = 0; -   rast.multisample = 0; -   rast.line_smooth = 0; -   rast.line_stipple_enable = 0; -   rast.line_stipple_factor = 0; -   rast.line_stipple_pattern = 0; -   rast.line_last_pixel = 0; -   rast.line_width = 1; -   rast.point_smooth = 0; -   rast.point_quad_rasterization = 0; -   rast.point_size = 1; -   rast.offset_units = 1; -   rast.offset_scale = 1; -   ctx->rast = ctx->pipe->create_rasterizer_state(ctx->pipe, &rast); -   ctx->pipe->bind_rasterizer_state(ctx->pipe, ctx->rast); - -   blend.independent_blend_enable = 0; -   blend.rt[0].blend_enable = 0; -   blend.rt[0].rgb_func = PIPE_BLEND_ADD; -   blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; -   blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ONE; -   blend.rt[0].alpha_func = PIPE_BLEND_ADD; -   blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; -   blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE; -   blend.logicop_enable = 0; -   blend.logicop_func = PIPE_LOGICOP_CLEAR; -   /* Needed to allow color writes to FB, even if blending disabled */ -   blend.rt[0].colormask = PIPE_MASK_RGBA; -   blend.dither = 0; -   ctx->blend = ctx->pipe->create_blend_state(ctx->pipe, &blend); -   ctx->pipe->bind_blend_state(ctx->pipe, ctx->blend); - -   dsa.depth.enabled = 0; -   dsa.depth.writemask = 0; -   dsa.depth.func = PIPE_FUNC_ALWAYS; -   for (i = 0; i < 2; ++i) { -      dsa.stencil[i].enabled = 0; -      dsa.stencil[i].func = PIPE_FUNC_ALWAYS; -      dsa.stencil[i].fail_op = PIPE_STENCIL_OP_KEEP; -      dsa.stencil[i].zpass_op = PIPE_STENCIL_OP_KEEP; -      dsa.stencil[i].zfail_op = PIPE_STENCIL_OP_KEEP; -      dsa.stencil[i].valuemask = 0; -      dsa.stencil[i].writemask = 0; -   } -   dsa.alpha.enabled = 0; -   dsa.alpha.func = PIPE_FUNC_ALWAYS; -   dsa.alpha.ref_value = 0; -   ctx->dsa = ctx->pipe->create_depth_stencil_alpha_state(ctx->pipe, &dsa); -   ctx->pipe->bind_depth_stencil_alpha_state(ctx->pipe, ctx->dsa); -	 -   return true; -} - -static struct pipe_video_context * -sp_mpeg12_create(struct pipe_screen *screen, enum pipe_video_profile profile, -                 enum pipe_video_chroma_format chroma_format, -                 unsigned width, unsigned height) -{ -   struct sp_mpeg12_context *ctx; - -   assert(u_reduce_video_profile(profile) == PIPE_VIDEO_CODEC_MPEG12); - -   ctx = CALLOC_STRUCT(sp_mpeg12_context); - -   if (!ctx) -      return NULL; - -   ctx->base.profile = profile; -   ctx->base.chroma_format = chroma_format; -   ctx->base.width = width; -   ctx->base.height = height; - -   ctx->base.screen = screen; -   ctx->base.destroy = sp_mpeg12_destroy; -   ctx->base.decode_macroblocks = sp_mpeg12_decode_macroblocks; -   ctx->base.clear_surface = sp_mpeg12_clear_surface; -   ctx->base.render_picture = sp_mpeg12_render_picture; -   ctx->base.set_decode_target = sp_mpeg12_set_decode_target; -   ctx->base.set_csc_matrix = sp_mpeg12_set_csc_matrix; - -   ctx->pipe = screen->context_create(screen, NULL); -   if (!ctx->pipe) { -      FREE(ctx); -      return NULL; -   } - -   /* TODO: Use slice buffering for softpipe when implemented, no advantage to buffering an entire picture */ -   if (!vl_mpeg12_mc_renderer_init(&ctx->mc_renderer, ctx->pipe, -                                   width, height, chroma_format, -                                   VL_MPEG12_MC_RENDERER_BUFFER_PICTURE, -                                   /* TODO: Use XFER_NONE when implemented */ -                                   VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_ONE, -                                   true)) { -      ctx->pipe->destroy(ctx->pipe); -      FREE(ctx); -      return NULL; -   } -	 -   if (!vl_compositor_init(&ctx->compositor, ctx->pipe)) { -      vl_mpeg12_mc_renderer_cleanup(&ctx->mc_renderer); -      ctx->pipe->destroy(ctx->pipe); -      FREE(ctx); -      return NULL; -   } -	 -   if (!init_pipe_state(ctx)) { -      vl_compositor_cleanup(&ctx->compositor); -      vl_mpeg12_mc_renderer_cleanup(&ctx->mc_renderer); -      ctx->pipe->destroy(ctx->pipe); -      FREE(ctx); -      return NULL; -   } - -   return &ctx->base; -} - -struct pipe_video_context * -sp_video_create(struct pipe_screen *screen, enum pipe_video_profile profile, -                enum pipe_video_chroma_format chroma_format, -                unsigned width, unsigned height) -{ -   assert(screen); -   assert(width && height); - -   switch (u_reduce_video_profile(profile)) { -      case PIPE_VIDEO_CODEC_MPEG12: -         return sp_mpeg12_create(screen, profile, -                                 chroma_format, -                                 width, height); -      default: -         return NULL; -   } -} diff --git a/src/gallium/drivers/softpipe/sp_video_context.h b/src/gallium/drivers/softpipe/sp_video_context.h deleted file mode 100644 index ccbd1ffe4c..0000000000 --- a/src/gallium/drivers/softpipe/sp_video_context.h +++ /dev/null @@ -1,57 +0,0 @@ -/************************************************************************** - *  - * Copyright 2009 Younes Manton. - * All Rights Reserved. - *  - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - *  - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - *  - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *  - **************************************************************************/ - -#ifndef SP_VIDEO_CONTEXT_H -#define SP_VIDEO_CONTEXT_H - -#include <pipe/p_video_context.h> -#include <vl/vl_mpeg12_mc_renderer.h> -#include <vl/vl_compositor.h> - -struct pipe_screen; -struct pipe_context; -struct pipe_video_surface; - -struct sp_mpeg12_context -{ -   struct pipe_video_context base; -   struct pipe_context *pipe; -   struct pipe_video_surface *decode_target; -   struct vl_mpeg12_mc_renderer mc_renderer; -   struct vl_compositor compositor; - -   void *rast; -   void *dsa; -   void *blend; -}; - -struct pipe_video_context * -sp_video_create(struct pipe_screen *screen, enum pipe_video_profile profile, -                enum pipe_video_chroma_format chroma_format, -                unsigned width, unsigned height); - -#endif /* SP_VIDEO_CONTEXT_H */ diff --git a/src/gallium/drivers/softpipe/sp_winsys.c b/src/gallium/drivers/softpipe/sp_winsys.c deleted file mode 100644 index 0a6245ed2c..0000000000 --- a/src/gallium/drivers/softpipe/sp_winsys.c +++ /dev/null @@ -1,245 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, Inc., Bismarck, ND., USA - * All Rights Reserved. - *  - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - *  - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR  - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE  - * USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - *  - *  - **************************************************************************/ - -/** - * @file - * Malloc softpipe winsys. Uses malloc for all memory allocations. - *  - * @author Keith Whitwell - * @author Brian Paul - * @author Jose Fonseca - */ - - -#include "util/u_simple_screen.h"/* port to just p_screen */ -#include "util/u_format.h" -#include "util/u_math.h" -#include "util/u_memory.h" -#include "util/u_inlines.h" -#include "pipe/p_format.h" -#include "pipe/p_context.h" -#include "sp_winsys.h" - - -struct st_softpipe_buffer -{ -   struct pipe_buffer base; -   boolean userBuffer;  /** Is this a user-space buffer? */ -   void *data; -   void *mapped; -}; - - -/** Cast wrapper */ -static INLINE struct st_softpipe_buffer * -st_softpipe_buffer( struct pipe_buffer *buf ) -{ -   return (struct st_softpipe_buffer *)buf; -} - - -static void * -st_softpipe_buffer_map(struct pipe_winsys *winsys,  -                       struct pipe_buffer *buf, -                       unsigned flags) -{ -   struct st_softpipe_buffer *st_softpipe_buf = st_softpipe_buffer(buf); -   st_softpipe_buf->mapped = st_softpipe_buf->data; -   return st_softpipe_buf->mapped; -} - - -static void -st_softpipe_buffer_unmap(struct pipe_winsys *winsys,  -                         struct pipe_buffer *buf) -{ -   struct st_softpipe_buffer *st_softpipe_buf = st_softpipe_buffer(buf); -   st_softpipe_buf->mapped = NULL; -} - - -static void -st_softpipe_buffer_destroy(struct pipe_buffer *buf) -{ -   struct st_softpipe_buffer *oldBuf = st_softpipe_buffer(buf); - -   if (oldBuf->data) { -      if (!oldBuf->userBuffer) -         align_free(oldBuf->data); - -      oldBuf->data = NULL; -   } - -   FREE(oldBuf); -} - - -static void -st_softpipe_flush_frontbuffer(struct pipe_winsys *winsys, -                              struct pipe_surface *surf, -                              void *context_private) -{ -} - - - -static const char * -st_softpipe_get_name(struct pipe_winsys *winsys) -{ -   return "softpipe"; -} - - -static struct pipe_buffer * -st_softpipe_buffer_create(struct pipe_winsys *winsys,  -                          unsigned alignment,  -                          unsigned usage, -                          unsigned size) -{ -   struct st_softpipe_buffer *buffer = CALLOC_STRUCT(st_softpipe_buffer); - -   pipe_reference_init(&buffer->base.reference, 1); -   buffer->base.alignment = alignment; -   buffer->base.usage = usage; -   buffer->base.size = size; - -   buffer->data = align_malloc(size, alignment); - -   return &buffer->base; -} - - -/** - * Create buffer which wraps user-space data. - */ -static struct pipe_buffer * -st_softpipe_user_buffer_create(struct pipe_winsys *winsys,  -                               void *ptr,  -                               unsigned bytes) -{ -   struct st_softpipe_buffer *buffer; -    -   buffer = CALLOC_STRUCT(st_softpipe_buffer); -   if(!buffer) -      return NULL; -    -   pipe_reference_init(&buffer->base.reference, 1); -   buffer->base.size = bytes; -   buffer->userBuffer = TRUE; -   buffer->data = ptr; - -   return &buffer->base; -} - - -static struct pipe_buffer * -st_softpipe_surface_buffer_create(struct pipe_winsys *winsys, -                                  unsigned width, unsigned height, -                                  enum pipe_format format, -                                  unsigned usage, -                                  unsigned tex_usage, -                                  unsigned *stride) -{ -   const unsigned alignment = 64; -   unsigned nblocksy; - -   nblocksy = util_format_get_nblocksy(format, height); -   *stride = align(util_format_get_stride(format, width), alignment); - -   return winsys->buffer_create(winsys, alignment, -                                usage, -                                *stride * nblocksy); -} - - -static void -st_softpipe_fence_reference(struct pipe_winsys *winsys,  -                            struct pipe_fence_handle **ptr, -                            struct pipe_fence_handle *fence) -{ -} - - -static int -st_softpipe_fence_signalled(struct pipe_winsys *winsys,  -                            struct pipe_fence_handle *fence, -                            unsigned flag) -{ -   return 0; -} - - -static int -st_softpipe_fence_finish(struct pipe_winsys *winsys,  -                         struct pipe_fence_handle *fence, -                         unsigned flag) -{ -   return 0; -} - - -static void -st_softpipe_destroy(struct pipe_winsys *winsys) -{ -   FREE(winsys); -} - - -struct pipe_screen * -softpipe_create_screen_malloc(void) -{ -   static struct pipe_winsys *winsys; -   struct pipe_screen *screen; - -   winsys = CALLOC_STRUCT(pipe_winsys); -   if(!winsys) -      return NULL; - -   winsys->destroy = st_softpipe_destroy; -    -   winsys->buffer_create = st_softpipe_buffer_create; -   winsys->user_buffer_create = st_softpipe_user_buffer_create; -   winsys->buffer_map = st_softpipe_buffer_map; -   winsys->buffer_unmap = st_softpipe_buffer_unmap; -   winsys->buffer_destroy = st_softpipe_buffer_destroy; - -   winsys->surface_buffer_create = st_softpipe_surface_buffer_create; - -   winsys->fence_reference = st_softpipe_fence_reference; -   winsys->fence_signalled = st_softpipe_fence_signalled; -   winsys->fence_finish = st_softpipe_fence_finish; - -   winsys->flush_frontbuffer = st_softpipe_flush_frontbuffer; -   winsys->get_name = st_softpipe_get_name; - -   screen = softpipe_create_screen(winsys); -   if(!screen) -      st_softpipe_destroy(winsys); - -   return screen; -} diff --git a/src/gallium/drivers/softpipe/sp_winsys.h b/src/gallium/drivers/softpipe/sp_winsys.h deleted file mode 100644 index 6e3920c49b..0000000000 --- a/src/gallium/drivers/softpipe/sp_winsys.h +++ /dev/null @@ -1,73 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. - * All Rights Reserved. - *  - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - *  - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - *  - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *  - **************************************************************************/ - -/* This is the interface that softpipe requires any window system - * hosting it to implement.  This is the only include file in softpipe - * which is public. - */ - - -#ifndef SP_WINSYS_H -#define SP_WINSYS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "pipe/p_defines.h" - -struct pipe_screen; -struct pipe_winsys; -struct pipe_context; -struct pipe_texture; -struct pipe_buffer; - - - -/** - * Create a softpipe screen that uses the - * given winsys for allocating buffers. - */ -struct pipe_screen *softpipe_create_screen( struct pipe_winsys * ); - -/** - * Create a softpipe screen that uses - * regular malloc to create all its buffers. - */ -struct pipe_screen *softpipe_create_screen_malloc(void); - -boolean -softpipe_get_texture_buffer( struct pipe_texture *texture, -                             struct pipe_buffer **buf, -                             unsigned *stride ); - - -#ifdef __cplusplus -} -#endif - -#endif /* SP_WINSYS_H */ | 
