1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
/**************************************************************************
*
* Copyright 2009, VMware, Inc.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sub license, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**************************************************************************/
#ifndef DRI_DRAWABLE_H
#define DRI_DRAWABLE_H
#include "pipe/p_compiler.h"
#include "util/format/u_formats.h"
#include "frontend/api.h"
#include "dri_util.h"
struct dri_context;
struct dri_screen;
struct dri_drawable
{
struct pipe_frontend_drawable base;
struct st_visual stvis;
struct dri_screen *screen;
__DRIbuffer old[__DRI_BUFFER_COUNT];
unsigned old_num;
unsigned old_w;
unsigned old_h;
struct pipe_box *damage_rects;
unsigned int num_damage_rects;
struct pipe_resource *textures[ST_ATTACHMENT_COUNT];
struct pipe_resource *msaa_textures[ST_ATTACHMENT_COUNT];
unsigned int texture_mask, texture_stamp;
int swap_interval;
struct pipe_fence_handle *throttle_fence;
bool flushing; /* prevents recursion in dri_flush */
/**
* Private data from the loader. We just hold on to it and pass
* it back when calling into loader provided functions.
*/
void *loaderPrivate;
/**
* Reference count for number of context's currently bound to this
* drawable.
*
* Once it reaches zero, the drawable can be destroyed.
*
* \note This behavior will change with GLX 1.3.
*/
int refcount;
/**
* Increased when the loader calls invalidate.
*
* If this changes, the drawable information (below) should be retrieved
* from the loader.
*/
unsigned int lastStamp;
int w, h;
/* kopper */
struct kopper_loader_info info;
__DRIimage *image; //texture_from_pixmap
bool is_window;
/* hooks filled in by dri2 & drisw */
void (*allocate_textures)(struct dri_context *ctx,
struct dri_drawable *drawable,
const enum st_attachment_type *statts,
unsigned count);
void (*update_drawable_info)(struct dri_drawable *drawable);
bool (*flush_frontbuffer)(struct dri_context *ctx,
struct dri_drawable *drawable,
enum st_attachment_type statt);
void (*update_tex_buffer)(struct dri_drawable *drawable,
struct dri_context *ctx,
struct pipe_resource *res);
void (*flush_swapbuffers)(struct dri_context *ctx,
struct dri_drawable *drawable);
void (*swap_buffers)(struct dri_drawable *drawable);
};
/* Typecast the opaque pointer to our own type. */
static inline struct dri_drawable *
dri_drawable(__DRIdrawable *drawable)
{
return (struct dri_drawable *)drawable;
}
/* Typecast our own type to the opaque pointer. */
static inline __DRIdrawable *
opaque_dri_drawable(struct dri_drawable *drawable)
{
return (__DRIdrawable *)drawable;
}
static inline void
dri_get_drawable(struct dri_drawable *drawable)
{
drawable->refcount++;
}
/***********************************************************************
* dri_drawable.c
*/
struct dri_drawable *
dri_create_drawable(struct dri_screen *screen, const struct gl_config *visual,
bool isPixmap, void *loaderPrivate);
void
dri_put_drawable(struct dri_drawable *drawable);
void
dri_drawable_get_format(struct dri_drawable *drawable,
enum st_attachment_type statt,
enum pipe_format *format,
unsigned *bind);
void
dri_pipe_blit(struct pipe_context *pipe,
struct pipe_resource *dst,
struct pipe_resource *src);
void
dri_flush(__DRIcontext *cPriv,
__DRIdrawable *dPriv,
unsigned flags,
enum __DRI2throttleReason reason);
void
dri_flush_drawable(__DRIdrawable *dPriv);
extern const __DRItexBufferExtension driTexBufferExtension;
extern const __DRI2throttleExtension dri2ThrottleExtension;
#endif
/* vim: set sw=3 ts=8 sts=3 expandtab: */
|