st/mesa: fix fallout from xfb changes.
[mesa.git] / src / mesa / state_tracker / st_context.c
index cba7f74c3a39d0627cbbbbbf2b3c93938d77146d..f5a6f8598ca063e1c475c242f33484e1c19cabe4 100644 (file)
@@ -141,9 +141,7 @@ void st_invalidate_state(struct gl_context * ctx, GLbitfield new_state)
 
    /* Invalidate render and compute pipelines. */
    st->dirty.mesa |= new_state;
-   st->dirty.st |= ST_NEW_MESA;
    st->dirty_cp.mesa |= new_state;
-   st->dirty_cp.st |= ST_NEW_MESA;
 
    /* This is the only core Mesa module we depend upon.
     * No longer use swrast, swsetup, tnl.
@@ -186,6 +184,10 @@ st_destroy_context_priv(struct st_context *st)
       u_upload_destroy(st->constbuf_uploader);
    }
 
+   /* free glDrawPixels cache data */
+   free(st->drawpix_cache.image);
+   pipe_resource_reference(&st->drawpix_cache.texture, NULL);
+
    cso_destroy_context(st->cso_context);
    free( st );
 }
@@ -248,16 +250,30 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
    else
       st->internal_target = PIPE_TEXTURE_RECT;
 
-   /* Vertex element objects used for drawing rectangles for glBitmap,
-    * glDrawPixels, glClear, etc.
+   /* Setup vertex element info for 'struct st_util_vertex'.
     */
-   for (i = 0; i < ARRAY_SIZE(st->velems_util_draw); i++) {
-      memset(&st->velems_util_draw[i], 0, sizeof(struct pipe_vertex_element));
-      st->velems_util_draw[i].src_offset = i * 4 * sizeof(float);
-      st->velems_util_draw[i].instance_divisor = 0;
-      st->velems_util_draw[i].vertex_buffer_index =
-            cso_get_aux_vertex_buffer_slot(st->cso_context);
-      st->velems_util_draw[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
+   {
+      const unsigned slot = cso_get_aux_vertex_buffer_slot(st->cso_context);
+
+      /* If this assertion ever fails all state tracker calls to
+       * cso_get_aux_vertex_buffer_slot() should be audited.  This
+       * particular call would have to be moved to just before each
+       * drawing call.
+       */
+      assert(slot == 0);
+
+      STATIC_ASSERT(sizeof(struct st_util_vertex) == 9 * sizeof(float));
+
+      memset(&st->util_velems, 0, sizeof(st->util_velems));
+      st->util_velems[0].src_offset = 0;
+      st->util_velems[0].vertex_buffer_index = slot;
+      st->util_velems[0].src_format = PIPE_FORMAT_R32G32B32_FLOAT;
+      st->util_velems[1].src_offset = 3 * sizeof(float);
+      st->util_velems[1].vertex_buffer_index = slot;
+      st->util_velems[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
+      st->util_velems[2].src_offset = 7 * sizeof(float);
+      st->util_velems[2].vertex_buffer_index = slot;
+      st->util_velems[2].src_format = PIPE_FORMAT_R32G32_FLOAT;
    }
 
    /* we want all vertex data to be placed in buffer objects */
@@ -269,9 +285,9 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
 
    /* Need these flags:
     */
-   st->ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
+   ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
 
-   st->ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
+   ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
 
    st->has_stencil_export =
       screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT);
@@ -335,8 +351,8 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
    /* called after _mesa_create_context/_mesa_init_point, fix default user
     * settable max point size up
     */
-   st->ctx->Point.MaxSize = MAX2(ctx->Const.MaxPointSize,
-                                 ctx->Const.MaxPointSizeAA);
+   ctx->Point.MaxSize = MAX2(ctx->Const.MaxPointSize,
+                             ctx->Const.MaxPointSizeAA);
    /* For vertex shaders, make sure not to emit saturate when SM 3.0 is not supported */
    ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].EmitNoSat = !st->has_shader_model3;
 
@@ -458,7 +474,7 @@ void st_destroy_context( struct st_context *st )
    pipe_sampler_view_reference(&st->pixel_xfer.pixelmap_sampler_view, NULL);
    pipe_resource_reference(&st->pixel_xfer.pixelmap_texture, NULL);
 
-   _vbo_DestroyContext(st->ctx);
+   _vbo_DestroyContext(ctx);
 
    st_destroy_program_variants(st);