1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
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" |
|
1.2.28
by Robert Hooker
Import upstream version 7.9~git20100909 |
42 |
#include "st_manager.h" |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
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 |
||
1.2.20
by Bryce Harrington
Import upstream version 7.6.0~git20090817.7c422387 |
50 |
/** Check if we have a front color buffer and if it's been drawn to. */
|
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
51 |
static INLINE GLboolean |
52 |
is_front_buffer_dirty(struct st_context *st) |
|
53 |
{
|
|
1.3.9
by Cyril Brulebois
Import upstream version 7.10 |
54 |
struct gl_framebuffer *fb = st->ctx->DrawBuffer; |
1.2.28
by Robert Hooker
Import upstream version 7.9~git20100909 |
55 |
struct st_renderbuffer *strb |
56 |
= st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer); |
|
57 |
return strb && strb->defined; |
|
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
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 |
{
|
|
1.3.9
by Cyril Brulebois
Import upstream version 7.10 |
67 |
struct gl_framebuffer *fb = st->ctx->DrawBuffer; |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
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 |
*/
|
|
1.2.28
by Robert Hooker
Import upstream version 7.9~git20100909 |
74 |
st_manager_flush_frontbuffer(st); |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
75 |
}
|
76 |
}
|
|
77 |
||
78 |
||
1.6.1
by Cyril Brulebois
Import upstream version 7.11~0 |
79 |
void st_flush( struct st_context *st, |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
80 |
struct pipe_fence_handle **fence ) |
81 |
{
|
|
82 |
FLUSH_CURRENT(st->ctx, 0); |
|
83 |
||
1.7.6
by Timo Aaltonen
Import upstream version 9.0~git20120821.c1114c61 |
84 |
st_flush_bitmap_cache(st); |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
85 |
|
1.6.1
by Cyril Brulebois
Import upstream version 7.11~0 |
86 |
st->pipe->flush( st->pipe, fence ); |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
87 |
}
|
88 |
||
89 |
||
90 |
/**
|
|
91 |
* Flush, and wait for completion.
|
|
92 |
*/
|
|
93 |
void st_finish( struct st_context *st ) |
|
94 |
{
|
|
95 |
struct pipe_fence_handle *fence = NULL; |
|
96 |
||
1.6.1
by Cyril Brulebois
Import upstream version 7.11~0 |
97 |
st_flush(st, &fence); |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
98 |
|
99 |
if(fence) { |
|
1.6.1
by Cyril Brulebois
Import upstream version 7.11~0 |
100 |
st->pipe->screen->fence_finish(st->pipe->screen, fence, |
101 |
PIPE_TIMEOUT_INFINITE); |
|
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
102 |
st->pipe->screen->fence_reference(st->pipe->screen, &fence, NULL); |
103 |
}
|
|
104 |
}
|
|
105 |
||
106 |
||
107 |
||
108 |
/**
|
|
109 |
* Called via ctx->Driver.Flush()
|
|
110 |
*/
|
|
1.3.9
by Cyril Brulebois
Import upstream version 7.10 |
111 |
static void st_glFlush(struct gl_context *ctx) |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
112 |
{
|
1.2.28
by Robert Hooker
Import upstream version 7.9~git20100909 |
113 |
struct st_context *st = st_context(ctx); |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
114 |
|
115 |
/* Don't call st_finish() here. It is not the state tracker's
|
|
116 |
* responsibilty to inject sleeps in the hope of avoiding buffer
|
|
117 |
* synchronization issues. Calling finish() here will just hide
|
|
118 |
* problems that need to be fixed elsewhere.
|
|
119 |
*/
|
|
1.6.1
by Cyril Brulebois
Import upstream version 7.11~0 |
120 |
st_flush(st, NULL); |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
121 |
|
122 |
if (is_front_buffer_dirty(st)) { |
|
123 |
display_front_buffer(st); |
|
124 |
}
|
|
125 |
}
|
|
126 |
||
127 |
||
128 |
/**
|
|
129 |
* Called via ctx->Driver.Finish()
|
|
130 |
*/
|
|
1.3.9
by Cyril Brulebois
Import upstream version 7.10 |
131 |
static void st_glFinish(struct gl_context *ctx) |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
132 |
{
|
1.2.28
by Robert Hooker
Import upstream version 7.9~git20100909 |
133 |
struct st_context *st = st_context(ctx); |
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
134 |
|
135 |
st_finish(st); |
|
136 |
||
137 |
if (is_front_buffer_dirty(st)) { |
|
138 |
display_front_buffer(st); |
|
139 |
}
|
|
140 |
}
|
|
141 |
||
142 |
||
143 |
void st_init_flush_functions(struct dd_function_table *functions) |
|
144 |
{
|
|
145 |
functions->Flush = st_glFlush; |
|
146 |
functions->Finish = st_glFinish; |
|
1.2.20
by Bryce Harrington
Import upstream version 7.6.0~git20090817.7c422387 |
147 |
|
148 |
/* Windows opengl32.dll calls glFinish prior to every swapbuffers.
|
|
149 |
* This is unnecessary and degrades performance. Luckily we have some
|
|
150 |
* scope to work around this, as the externally-visible behaviour of
|
|
151 |
* Finish() is identical to Flush() in all cases - no differences in
|
|
152 |
* rendering or ReadPixels are visible if we opt not to wait here.
|
|
153 |
*
|
|
154 |
* Only set this up on windows to avoid suprise elsewhere.
|
|
155 |
*/
|
|
156 |
#ifdef PIPE_OS_WINDOWS
|
|
157 |
functions->Finish = st_glFlush; |
|
158 |
#endif
|
|
1.3.3
by Julien Cristau
Import upstream version 7.5~rc4 |
159 |
}
|