state_tracker: Initialize the draw context only when needed.
authorEric Anholt <eric@anholt.net>
Tue, 2 Aug 2016 19:28:27 +0000 (12:28 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 4 Aug 2016 15:48:27 +0000 (08:48 -0700)
It's only used for rarely-used deprecated GL features
(feedback/rasterpos), so we can skip the memory allocation and
initialization for it most of the time.

Saves about 659k (out of 1605k) of maximum memory size according to massif
on simulated vc4 glsl-algebraic-add-add-1

Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/state_tracker/st_cb_feedback.c
src/mesa/state_tracker/st_cb_rasterpos.c
src/mesa/state_tracker/st_draw.c
src/mesa/state_tracker/st_draw.h
src/mesa/state_tracker/st_draw_feedback.c

index 735e268be870faf8ed93e3137b111a53339ddab1..a18f4f76bcf26bb8331691050e79797cf81658e0 100644 (file)
@@ -274,7 +274,10 @@ static void
 st_RenderMode(struct gl_context *ctx, GLenum newMode )
 {
    struct st_context *st = st_context(ctx);
-   struct draw_context *draw = st->draw;
+   struct draw_context *draw = st_get_draw_context(st);
+
+   if (!st->draw)
+      return;
 
    if (newMode == GL_RENDER) {
       /* restore normal VBO draw function */
index 29c1484718014f4083a8af1896b3981aacbecc08..5dda0e2c8b7b05b511316c2e406357385132a916 100644 (file)
@@ -219,10 +219,13 @@ static void
 st_RasterPos(struct gl_context *ctx, const GLfloat v[4])
 {
    struct st_context *st = st_context(ctx);
-   struct draw_context *draw = st->draw;
+   struct draw_context *draw = st_get_draw_context(st);
    struct rastpos_stage *rs;
    const struct gl_client_array **saved_arrays = ctx->Array._DrawArrays;
 
+   if (!st->draw)
+      return;
+
    if (ctx->VertexProgram._Current == NULL ||
        ctx->VertexProgram._Current == ctx->VertexProgram._TnlProgram) {
       /* No vertex shader/program is enabled, used the simple/fast fixed-
index b248dafc9a202d0f5aad873ace7c38c2b9c99e76..f4af23da97f36a258276ba158dba941d07d14c29 100644 (file)
@@ -346,8 +346,29 @@ st_init_draw(struct st_context *st)
 
    vbo_set_draw_func(ctx, st_draw_vbo);
    vbo_set_indirect_draw_func(ctx, st_indirect_draw_vbo);
+}
+
+
+void
+st_destroy_draw(struct st_context *st)
+{
+   draw_destroy(st->draw);
+}
 
-   st->draw = draw_create(st->pipe); /* for selection/feedback */
+/**
+ * Getter for the draw_context, so that initialization of it can happen only
+ * when needed (the TGSI exec machines take up quite a bit of memory).
+ */
+struct draw_context *
+st_get_draw_context(struct st_context *st)
+{
+   if (!st->draw) {
+      st->draw = draw_create(st->pipe);
+      if (!st->draw) {
+         _mesa_error(st->ctx, GL_OUT_OF_MEMORY, "feedback fallback allocation");
+         return NULL;
+      }
+   }
 
    /* Disable draw options that might convert points/lines to tris, etc.
     * as that would foul-up feedback/selection mode.
@@ -356,16 +377,10 @@ st_init_draw(struct st_context *st)
    draw_wide_point_threshold(st->draw, 1000.0f);
    draw_enable_line_stipple(st->draw, FALSE);
    draw_enable_point_sprites(st->draw, FALSE);
-}
-
 
-void
-st_destroy_draw(struct st_context *st)
-{
-   draw_destroy(st->draw);
+   return st->draw;
 }
 
-
 /**
  * Draw a quad with given position, texcoords and color.
  */
index d85c3b7facdd32183fb55d6eb60f74fba37f6bfe..fc863819c7e001fe7926876c8754b229bd691274 100644 (file)
@@ -47,6 +47,8 @@ void st_init_draw( struct st_context *st );
 
 void st_destroy_draw( struct st_context *st );
 
+struct draw_context *st_get_draw_context(struct st_context *st);
+
 extern void
 st_draw_vbo(struct gl_context *ctx,
             const struct _mesa_prim *prims,
index e76694d4b2b00e1134d8d5b35feaaea50bc5973f..6cc7dd77701da8e8609c5df17b1c444ce5add86c 100644 (file)
@@ -123,7 +123,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
 {
    struct st_context *st = st_context(ctx);
    struct pipe_context *pipe = st->pipe;
-   struct draw_context *draw = st->draw;
+   struct draw_context *draw = st_get_draw_context(st);
    const struct st_vertex_program *vp;
    const struct pipe_shader_state *vs;
    struct pipe_vertex_buffer vbuffers[PIPE_MAX_SHADER_INPUTS];
@@ -136,7 +136,8 @@ st_feedback_draw_vbo(struct gl_context *ctx,
    const GLubyte *low_addr = NULL;
    const void *mapped_indices = NULL;
 
-   assert(draw);
+   if (!draw)
+      return;
 
    st_flush_bitmap_cache(st);
    st_invalidate_readpix_cache(st);