i965g: get rid of cc key, simplify state upload
authorKeith Whitwell <keithw@vmware.com>
Fri, 6 Nov 2009 14:20:04 +0000 (14:20 +0000)
committerKeith Whitwell <keithw@vmware.com>
Fri, 6 Nov 2009 17:26:52 +0000 (17:26 +0000)
Keep a valid reloc table active between uploads, avoid
recalculating it every time.

src/gallium/drivers/i965/brw_cc.c
src/gallium/drivers/i965/brw_context.c
src/gallium/drivers/i965/brw_context.h
src/gallium/drivers/i965/brw_pipe_fb.c

index f05728ea5d7bc39d719c282520afed4a0df44444..3e070f5591adabe1c307057848af39710b596696 100644 (file)
 #include "brw_defines.h"
 
 
-struct sane_viewport {
-   float top;
-   float left;
-   float width;
-   float height;
-   float near;
-   float far;
-};
-
-static void calc_sane_viewport( const struct pipe_viewport_state *vp,
-                               struct sane_viewport *svp )
-{
-   /* XXX fix me, obviously.
-    */
-   svp->top = 0;
-   svp->left = 0;
-   svp->width = 250;
-   svp->height = 250;
-   svp->near = 0;
-   svp->far = 1;
-}
-
 static enum pipe_error prepare_cc_vp( struct brw_context *brw )
 {
-   struct brw_cc_viewport ccv;
-   struct sane_viewport svp;
-   enum pipe_error ret;
-
-   memset(&ccv, 0, sizeof(ccv));
-
-   /* PIPE_NEW_VIEWPORT */
-   calc_sane_viewport( &brw->curr.viewport, &svp );
-
-   ccv.min_depth = svp.near;
-   ccv.max_depth = svp.far;
-
-   ret = brw_cache_data( &brw->cache, BRW_CC_VP, &ccv, NULL, 0,
-                         &brw->cc.vp_bo );
-   if (ret)
-      return ret;
-                
-   return PIPE_OK;
+   return brw_cache_data( &brw->cache, 
+                         BRW_CC_VP,
+                         &brw->curr.ccv,
+                         NULL, 0,
+                         &brw->cc.reloc[CC_RELOC_VP].bo );
 }
 
 const struct brw_tracked_state brw_cc_vp = {
@@ -88,15 +53,6 @@ const struct brw_tracked_state brw_cc_vp = {
    .prepare = prepare_cc_vp
 };
 
-struct brw_cc_unit_key {
-   struct brw_cc0 cc0;
-   struct brw_cc1 cc1;
-   struct brw_cc2 cc2;
-   struct brw_cc3 cc3;
-   struct brw_cc5 cc5;
-   struct brw_cc6 cc6;
-   struct brw_cc7 cc7;
-};
 
 /* A long-winded way to OR two unsigned integers together:
  */
@@ -110,85 +66,22 @@ combine_cc3( struct brw_cc3 a, struct brw_cc3 b )
    return ca.cc3;
 }
 
-static void
-cc_unit_populate_key(const struct brw_context *brw,
-                    struct brw_cc_unit_key *key)
-{
-   key->cc0 = brw->curr.zstencil->cc0;
-   key->cc1 = brw->curr.zstencil->cc1;
-   key->cc2 = brw->curr.zstencil->cc2;
-   key->cc3 = combine_cc3( brw->curr.zstencil->cc3, brw->curr.blend->cc3 );
-   key->cc5 = brw->curr.blend->cc5;
-   key->cc6 = brw->curr.blend->cc6;
-   key->cc7 = brw->curr.zstencil->cc7;
-}
-
-/**
- * Creates the state cache entry for the given CC unit key.
- */
-static enum pipe_error
-cc_unit_create_from_key(struct brw_context *brw, 
-                        struct brw_cc_unit_key *key,
-                        struct brw_winsys_reloc *reloc,
-                        struct brw_winsys_buffer **bo_out)
-{
-   struct brw_cc_unit_state cc;
-   enum pipe_error ret;
-
-   memset(&cc, 0, sizeof(cc));
-
-   cc.cc0 = key->cc0;
-   cc.cc1 = key->cc1;
-   cc.cc2 = key->cc2;
-   cc.cc3 = key->cc3;
-
-   cc.cc4.cc_viewport_state_offset = 0;
-
-   cc.cc5 = key->cc5;
-   cc.cc6 = key->cc6;
-   cc.cc7 = key->cc7;
-   
-   ret = brw_upload_cache(&brw->cache, BRW_CC_UNIT,
-                          key, sizeof(*key),
-                          reloc, 1,
-                          &cc, sizeof(cc),
-                          NULL, NULL,
-                          bo_out);
-   if (ret)
-      return ret;
-
-   return PIPE_OK;
-}
 
 static int prepare_cc_unit( struct brw_context *brw )
 {
-   struct brw_cc_unit_key key;
-   struct brw_winsys_reloc reloc[1];
-   enum pipe_error ret;
-
-   cc_unit_populate_key(brw, &key);
-
-   /* CACHE_NEW_CC_VP */
-   make_reloc(&reloc[0],
-              BRW_USAGE_STATE,
-              0,
-              offsetof(struct brw_cc_unit_state, cc4),
-              brw->cc.vp_bo);
-
-   if (brw_search_cache(&brw->cache, BRW_CC_UNIT,
-                        &key, sizeof(key),
-                        reloc, 1,
-                        NULL,
-                        &brw->cc.state_bo))
-      return PIPE_OK;
-
-   ret = cc_unit_create_from_key(brw, &key, 
-                                 reloc,
-                                 &brw->cc.state_bo);
-   if (ret)
-      return ret;
+   brw->cc.cc.cc0 = brw->curr.zstencil->cc0;
+   brw->cc.cc.cc1 = brw->curr.zstencil->cc1;
+   brw->cc.cc.cc2 = brw->curr.zstencil->cc2;
+   brw->cc.cc.cc3 = combine_cc3( brw->curr.zstencil->cc3, brw->curr.blend->cc3 );
    
-   return PIPE_OK;
+   brw->cc.cc.cc5 = brw->curr.blend->cc5;
+   brw->cc.cc.cc6 = brw->curr.blend->cc6;
+   brw->cc.cc.cc7 = brw->curr.zstencil->cc7;
+
+   return brw_cache_data_sz(&brw->cache, BRW_CC_UNIT,
+                           &brw->cc.cc, sizeof(brw->cc.cc),
+                           brw->cc.reloc, 1,
+                           &brw->cc.state_bo);
 }
 
 const struct brw_tracked_state brw_cc_unit = {
@@ -201,4 +94,18 @@ const struct brw_tracked_state brw_cc_unit = {
 };
 
 
+void brw_hw_cc_init( struct brw_context *brw )
+{
+   make_reloc(&brw->cc.reloc[0],
+              BRW_USAGE_STATE,
+              0,
+              offsetof(struct brw_cc_unit_state, cc4),
+              NULL);
+}
+
 
+void brw_hw_cc_cleanup( struct brw_context *brw )
+{
+   bo_reference(&brw->cc.state_bo, NULL);
+   bo_reference(&brw->cc.reloc[0].bo, NULL);
+}
index f85116a568c1549a4a22ddf06b852a172f4ecb3b..e67551882dcb279afecde2a88ef6fbc2a67b50a1 100644 (file)
@@ -65,6 +65,9 @@ static void brw_destroy_context( struct pipe_context *pipe )
    brw_pipe_vertex_cleanup( brw );
    brw_pipe_clear_cleanup( brw );
 
+   brw_hw_cc_cleanup( brw );
+
+
    FREE(brw->wm.compile_data);
 
    for (i = 0; i < brw->curr.fb.nr_cbufs; i++)
@@ -96,9 +99,6 @@ static void brw_destroy_context( struct pipe_context *pipe )
    bo_reference(&brw->wm.sampler_bo, NULL);
    bo_reference(&brw->wm.prog_bo, NULL);
    bo_reference(&brw->wm.state_bo, NULL);
-   bo_reference(&brw->cc.prog_bo, NULL);
-   bo_reference(&brw->cc.state_bo, NULL);
-   bo_reference(&brw->cc.vp_bo, NULL);
 }
 
 
@@ -128,6 +128,8 @@ struct pipe_context *brw_create_context(struct pipe_screen *screen)
    brw_pipe_vertex_init( brw );
    brw_pipe_clear_init( brw );
 
+   brw_hw_cc_init( brw );
+
    brw_init_state( brw );
    brw_draw_init( brw );
 
index f53b92d4f53d692ece970cdaca6ca2a04ca60491..4a975ecd7ecca476dfabfd61b4eec71e6800fd86 100644 (file)
@@ -481,6 +481,8 @@ struct brw_query_object {
    uint64_t result;
 };
 
+#define CC_RELOC_VP 0
+
 
 /**
  * brw_context is derived from pipe_context
@@ -525,6 +527,7 @@ struct brw_context
 
       struct brw_blend_constant_color bcc;
       struct brw_polygon_stipple bps;
+      struct brw_cc_viewport ccv;
 
       /**
        * Index buffer for this draw_prims call.
@@ -708,9 +711,10 @@ struct brw_context
 
 
    struct {
-      struct brw_winsys_buffer *prog_bo;
       struct brw_winsys_buffer *state_bo;
-      struct brw_winsys_buffer *vp_bo;
+
+      struct brw_cc_unit_state cc;
+      struct brw_winsys_reloc reloc[1];
    } cc;
 
    struct {
@@ -764,6 +768,7 @@ void brw_pipe_shader_init( struct brw_context *brw );
 void brw_pipe_vertex_init( struct brw_context *brw );
 void brw_pipe_clear_init( struct brw_context *brw );
 
+
 void brw_pipe_blend_cleanup( struct brw_context *brw );
 void brw_pipe_depth_stencil_cleanup( struct brw_context *brw );
 void brw_pipe_framebuffer_cleanup( struct brw_context *brw );
@@ -776,6 +781,10 @@ void brw_pipe_shader_cleanup( struct brw_context *brw );
 void brw_pipe_vertex_cleanup( struct brw_context *brw );
 void brw_pipe_clear_cleanup( struct brw_context *brw );
 
+void brw_hw_cc_init( struct brw_context *brw );
+void brw_hw_cc_cleanup( struct brw_context *brw );
+
+
 
 void brw_context_flush( struct brw_context *brw );
 
index f65f45fb844addf13263dd47b5560a449c8abf2d..151122044784c38a5914b8d40edf99c64db26ac9 100644 (file)
@@ -49,7 +49,11 @@ static void brw_set_viewport_state( struct pipe_context *pipe,
                                    const struct pipe_viewport_state *viewport )
 {
    struct brw_context *brw = brw_context(pipe);
+
    brw->curr.viewport = *viewport;
+   brw->curr.ccv.min_depth = 0.0;         /* XXX: near */
+   brw->curr.ccv.max_depth = 1.0;         /* XXX: far */
+
    brw->state.dirty.mesa |= PIPE_NEW_VIEWPORT;
 }