2 * Mesa 3-D graphics library
5 * Copyright (C) 2010 LunarG Inc.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 * Chia-I Wu <olv@lunarg.com>
28 #include "util/u_memory.h"
29 #include "util/u_inlines.h"
30 #include "util/u_format.h"
31 #include "util/u_debug.h"
32 #include "state_tracker/st_manager.h" /* for st_manager_create_api */
34 #include "dri_screen.h"
35 #include "dri_context.h"
36 #include "dri_drawable.h"
37 #include "dri_st_api.h"
38 #ifndef __NOT_HAVE_DRM_H
46 dri_st_framebuffer_validate(struct st_framebuffer_iface
*stfbi
,
47 const enum st_attachment_type
*statts
,
49 struct pipe_texture
**out
)
51 struct dri_drawable
*drawable
=
52 (struct dri_drawable
*) stfbi
->st_manager_private
;
53 unsigned statt_mask
, new_mask
;
58 for (i
= 0; i
< count
; i
++)
59 statt_mask
|= (1 << statts
[i
]);
61 /* record newly allocated textures */
62 new_mask
= (statt_mask
& ~drawable
->texture_mask
);
65 * dPriv->pStamp is the server stamp. It should be accessed with a lock, at
66 * least for DRI1. dPriv->lastStamp is the client stamp. It has the value
67 * of the server stamp when last checked.
69 new_stamp
= (drawable
->texture_stamp
!= drawable
->dPriv
->lastStamp
);
71 if (new_stamp
|| new_mask
) {
73 #ifndef __NOT_HAVE_DRM_H
74 if (__dri1_api_hooks
) {
75 dri1_allocate_textures(drawable
, statt_mask
);
78 dri2_allocate_textures(drawable
, statts
, count
);
82 drisw_update_drawable_info(drawable
);
84 drisw_allocate_textures(drawable
, statt_mask
);
87 /* add existing textures */
88 for (i
= 0; i
< ST_ATTACHMENT_COUNT
; i
++) {
89 if (drawable
->textures
[i
])
90 statt_mask
|= (1 << i
);
93 drawable
->texture_stamp
= drawable
->dPriv
->lastStamp
;
94 drawable
->texture_mask
= statt_mask
;
100 for (i
= 0; i
< count
; i
++) {
102 pipe_texture_reference(&out
[i
], drawable
->textures
[statts
[i
]]);
109 dri_st_framebuffer_flush_front(struct st_framebuffer_iface
*stfbi
,
110 enum st_attachment_type statt
)
112 struct dri_drawable
*drawable
=
113 (struct dri_drawable
*) stfbi
->st_manager_private
;
115 #ifndef __NOT_HAVE_DRM_H
116 if (__dri1_api_hooks
) {
117 dri1_flush_frontbuffer(drawable
, statt
);
120 dri2_flush_frontbuffer(drawable
, statt
);
123 drisw_flush_frontbuffer(drawable
, statt
);
130 * Create a framebuffer from the given drawable.
132 struct st_framebuffer_iface
*
133 dri_create_st_framebuffer(struct dri_drawable
*drawable
)
135 struct st_framebuffer_iface
*stfbi
;
137 stfbi
= CALLOC_STRUCT(st_framebuffer_iface
);
139 stfbi
->visual
= &drawable
->stvis
;
140 stfbi
->flush_front
= dri_st_framebuffer_flush_front
;
141 stfbi
->validate
= dri_st_framebuffer_validate
;
142 stfbi
->st_manager_private
= (void *) drawable
;
149 * Destroy a framebuffer.
152 dri_destroy_st_framebuffer(struct st_framebuffer_iface
*stfbi
)
154 struct dri_drawable
*drawable
=
155 (struct dri_drawable
*) stfbi
->st_manager_private
;
158 for (i
= 0; i
< ST_ATTACHMENT_COUNT
; i
++)
159 pipe_texture_reference(&drawable
->textures
[i
], NULL
);
165 * Validate the texture at an attachment. Allocate the texture if it does not
169 dri_st_framebuffer_validate_att(struct st_framebuffer_iface
*stfbi
,
170 enum st_attachment_type statt
)
172 struct dri_drawable
*drawable
=
173 (struct dri_drawable
*) stfbi
->st_manager_private
;
174 enum st_attachment_type statts
[ST_ATTACHMENT_COUNT
];
175 unsigned i
, count
= 0;
177 /* check if buffer already exists */
178 if (drawable
->texture_mask
& (1 << statt
))
181 /* make sure DRI2 does not destroy existing buffers */
182 for (i
= 0; i
< ST_ATTACHMENT_COUNT
; i
++) {
183 if (drawable
->texture_mask
& (1 << i
)) {
187 statts
[count
++] = statt
;
189 drawable
->texture_stamp
= drawable
->dPriv
->lastStamp
- 1;
191 stfbi
->validate(stfbi
, statts
, count
, NULL
);
195 * Reference counted st_api.
199 struct st_api
*stapi
;
203 * Add a reference to the st_api of the state tracker.
206 _dri_get_st_api(void)
208 p_atomic_inc(&dri_st_api
.refcnt
);
209 if (p_atomic_read(&dri_st_api
.refcnt
) == 1)
210 dri_st_api
.stapi
= st_manager_create_api();
214 * Remove a reference to the st_api of the state tracker.
217 _dri_put_st_api(void)
219 struct st_api
*stapi
= dri_st_api
.stapi
;
221 if (p_atomic_dec_zero(&dri_st_api
.refcnt
)) {
222 stapi
->destroy(dri_st_api
.stapi
);
223 dri_st_api
.stapi
= NULL
;
228 * Create a state tracker manager from the given screen.
231 dri_create_st_manager(struct dri_screen
*screen
)
233 struct st_manager
*smapi
;
235 smapi
= CALLOC_STRUCT(st_manager
);
237 smapi
->screen
= screen
->pipe_screen
;
245 * Destroy a state tracker manager.
248 dri_destroy_st_manager(struct st_manager
*smapi
)
255 * Return the st_api of OpenGL state tracker.
260 assert(dri_st_api
.stapi
);
261 return dri_st_api
.stapi
;