st/mesa: add new driver function DrawBufferAllocate
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 24 Apr 2018 04:19:48 +0000 (14:19 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Tue, 24 Apr 2018 23:08:26 +0000 (09:08 +1000)
Unlike some of the classic drivers the st was only using DrawBuffer()
to allocated some buffers on-demand. Creating a separate function
will allow us to call it from update_framebuffer() in the following
patch without regressing some of the older classic drivers.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/main/buffers.c
src/mesa/main/dd.h
src/mesa/state_tracker/st_cb_fbo.c

index 7bb5725d0857b6170e78dabe7260b9d696c07038..ba970d87dad93a4d7a9c65bd3f9e6497f6c643ee 100644 (file)
@@ -306,6 +306,8 @@ draw_buffer(struct gl_context *ctx, struct gl_framebuffer *fb,
    if (fb == ctx->DrawBuffer) {
       if (ctx->Driver.DrawBuffer)
          ctx->Driver.DrawBuffer(ctx, buffer);
+      if (ctx->Driver.DrawBufferAllocate)
+         ctx->Driver.DrawBufferAllocate(ctx);
    }
 }
 
@@ -587,6 +589,8 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n,
    if (fb == ctx->DrawBuffer) {
       if (ctx->Driver.DrawBuffer)
          ctx->Driver.DrawBuffer(ctx, n > 0 ? buffers[0] : GL_NONE);
+      if (ctx->Driver.DrawBufferAllocate)
+         ctx->Driver.DrawBufferAllocate(ctx);
    }
 }
 
index d85d89ef50ce80797f24a171dae7f73b81322aaf..5ee6902d3fb8107bdcd69d2afbaca4dea6c8cb83 100644 (file)
@@ -611,7 +611,9 @@ struct dd_function_table {
    /** Specify mapping of depth values from NDC to window coordinates */
    void (*DepthRange)(struct gl_context *ctx);
    /** Specify the current buffer for writing */
-   void (*DrawBuffer)( struct gl_context *ctx, GLenum buffer );
+   void (*DrawBuffer)(struct gl_context *ctx, GLenum buffer);
+   /** Used to allocated any buffers with on-demand creation */
+   void (*DrawBufferAllocate)(struct gl_context *ctx);
    /** Enable or disable server-side gl capabilities */
    void (*Enable)(struct gl_context *ctx, GLenum cap, GLboolean state);
    /** Specify fog parameters */
index 696a08fd65b45cd06cf66f9210f0107dad7c0042..5eeec08655d749d544e41f085c4a7e956e90efd6 100644 (file)
@@ -714,13 +714,11 @@ st_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
  * created FBOs.
  */
 static void
-st_DrawBuffer(struct gl_context *ctx, GLenum buffer)
+st_DrawBufferAllocate(struct gl_context *ctx)
 {
    struct st_context *st = st_context(ctx);
    struct gl_framebuffer *fb = ctx->DrawBuffer;
 
-   (void) buffer;
-
    if (_mesa_is_winsys_fbo(fb)) {
       GLuint i;
       /* add the renderbuffers on demand */
@@ -736,8 +734,8 @@ st_DrawBuffer(struct gl_context *ctx, GLenum buffer)
 
 
 /**
- * Called via glReadBuffer.  As with st_DrawBuffer, we use this function
- * to check if we need to allocate a renderbuffer on demand.
+ * Called via glReadBuffer.  As with st_DrawBufferAllocate, we use this
+ * function to check if we need to allocate a renderbuffer on demand.
  */
 static void
 st_ReadBuffer(struct gl_context *ctx, GLenum buffer)
@@ -868,7 +866,7 @@ st_init_fbo_functions(struct dd_function_table *functions)
    functions->FinishRenderTexture = st_finish_render_texture;
    functions->ValidateFramebuffer = st_validate_framebuffer;
 
-   functions->DrawBuffer = st_DrawBuffer;
+   functions->DrawBufferAllocate = st_DrawBufferAllocate;
    functions->ReadBuffer = st_ReadBuffer;
 
    functions->MapRenderbuffer = st_MapRenderbuffer;