Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice (including the
  15.  * next paragraph) shall be included in all copies or substantial portions
  16.  * of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21.  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
  22.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  **************************************************************************/
  27.  
  28.  /*
  29.   * Authors:
  30.   *   Keith Whitwell <keith@tungstengraphics.com>
  31.   *   Brian Paul
  32.   */
  33.  
  34. #include "main/glheader.h"
  35. #include "main/macros.h"
  36. #include "main/context.h"
  37. #include "st_context.h"
  38. #include "st_cb_bitmap.h"
  39. #include "st_cb_flush.h"
  40. #include "st_cb_clear.h"
  41. #include "st_cb_fbo.h"
  42. #include "st_manager.h"
  43. #include "pipe/p_context.h"
  44. #include "pipe/p_defines.h"
  45. #include "pipe/p_screen.h"
  46. #include "util/u_gen_mipmap.h"
  47. #include "util/u_blit.h"
  48.  
  49.  
  50. /** Check if we have a front color buffer and if it's been drawn to. */
  51. static INLINE GLboolean
  52. is_front_buffer_dirty(struct st_context *st)
  53. {
  54.    struct gl_framebuffer *fb = st->ctx->DrawBuffer;
  55.    struct st_renderbuffer *strb
  56.       = st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
  57.    return strb && strb->defined;
  58. }
  59.  
  60.  
  61. /**
  62.  * Tell the screen to display the front color buffer on-screen.
  63.  */
  64. static void
  65. display_front_buffer(struct st_context *st)
  66. {
  67.    struct gl_framebuffer *fb = st->ctx->DrawBuffer;
  68.    struct st_renderbuffer *strb
  69.       = st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
  70.  
  71.    if (strb) {
  72.       /* Hook for copying "fake" frontbuffer if necessary:
  73.        */
  74.       st_manager_flush_frontbuffer(st);
  75.    }
  76. }
  77.  
  78.  
  79. void st_flush( struct st_context *st, uint pipeFlushFlags,
  80.                struct pipe_fence_handle **fence )
  81. {
  82.    FLUSH_CURRENT(st->ctx, 0);
  83.  
  84.    /* Release any vertex buffers that might potentially be accessed in
  85.     * successive frames:
  86.     */
  87.    st_flush_bitmap(st);
  88.    st_flush_clear(st);
  89.    util_blit_flush(st->blit);
  90.    util_gen_mipmap_flush(st->gen_mipmap);
  91.  
  92.    st->pipe->flush( st->pipe, pipeFlushFlags, fence );
  93. }
  94.  
  95.  
  96. /**
  97.  * Flush, and wait for completion.
  98.  */
  99. void st_finish( struct st_context *st )
  100. {
  101.    struct pipe_fence_handle *fence = NULL;
  102.  
  103.    st_flush(st, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
  104.  
  105.    if(fence) {
  106.       st->pipe->screen->fence_finish(st->pipe->screen, fence, 0);
  107.       st->pipe->screen->fence_reference(st->pipe->screen, &fence, NULL);
  108.    }
  109. }
  110.  
  111.  
  112.  
  113. /**
  114.  * Called via ctx->Driver.Flush()
  115.  */
  116. static void st_glFlush(struct gl_context *ctx)
  117. {
  118.    struct st_context *st = st_context(ctx);
  119.  
  120.    /* Don't call st_finish() here.  It is not the state tracker's
  121.     * responsibilty to inject sleeps in the hope of avoiding buffer
  122.     * synchronization issues.  Calling finish() here will just hide
  123.     * problems that need to be fixed elsewhere.
  124.     */
  125.    st_flush(st, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, NULL);
  126.  
  127.    if (is_front_buffer_dirty(st)) {
  128.       display_front_buffer(st);
  129.    }
  130. }
  131.  
  132.  
  133. /**
  134.  * Called via ctx->Driver.Finish()
  135.  */
  136. static void st_glFinish(struct gl_context *ctx)
  137. {
  138.    struct st_context *st = st_context(ctx);
  139.  
  140.    st_finish(st);
  141.  
  142.    if (is_front_buffer_dirty(st)) {
  143.       display_front_buffer(st);
  144.    }
  145. }
  146.  
  147.  
  148. void st_init_flush_functions(struct dd_function_table *functions)
  149. {
  150.    functions->Flush = st_glFlush;
  151.    functions->Finish = st_glFinish;
  152.  
  153.    /* Windows opengl32.dll calls glFinish prior to every swapbuffers.
  154.     * This is unnecessary and degrades performance.  Luckily we have some
  155.     * scope to work around this, as the externally-visible behaviour of
  156.     * Finish() is identical to Flush() in all cases - no differences in
  157.     * rendering or ReadPixels are visible if we opt not to wait here.
  158.     *
  159.     * Only set this up on windows to avoid suprise elsewhere.
  160.     */
  161. #ifdef PIPE_OS_WINDOWS
  162.    functions->Finish = st_glFlush;
  163. #endif
  164. }
  165.