1 // XXX: we rely on __attribute__((weak)), which is probably non-portable to Windows
4 #define extern extern __attribute__((weak))
5 #include <X11/extensions/Xrender.h>
12 #define API_CTX(f) ((ctx->space->api == API_OSMESA) ? _cairo_osmesa_context_##f : _cairo_glx_context_##f)
13 #define API_SPACE(f) ((space->api == API_OSMESA) ? _cairo_osmesa_space_##f : _cairo_glx_space_##f)
14 #define API_SURFACE_(r, f) if(surface->space->api == API_GLX) r = _cairo_glx_surface_##f
15 #define API_SURFACE(f) if(surface->space->api == API_GLX) _cairo_glx_surface_##f
17 #include "cairo-gpu-impl-defs-gl-glx.h"
18 #include "cairo-gpu-impl-defs-gl-osmesa.h"
20 struct _cairo_gpu_texture
22 CAIRO_GPU_BASE_TEXTURE_T
;
33 struct _cairo_gpu_subspace
;
34 typedef struct _cairo_gpu_subspace cairo_gpu_subspace_t
;
38 struct _cairo_gpu_surface
40 CAIRO_GPU_BASE_SURFACE_T
;
41 cairo_rectangle_int_t bbox
[MAX_SURFS
];
43 cairo_gpu_subspace_t
* subspace
;
51 GLXDrawable glxdrawable
;
52 char fbconfig_alpha_size
;
53 char fbconfig_color_size
;
56 char fbconfig_double_buffered
;
57 cairo_gpu_texture_t bound_texture
;
62 cairo_gpu_texture_t texture
;
69 char clear_rgba
; // clear all channels even if not CONTENT_COLOR_ALPHA
70 char buffer_non_upside_down
;
71 char draw_to_back_buffer
;
72 unsigned char has_drawable
;
75 typedef struct _cairo_gpu_context cairo_gpu_context_t
;
85 #define GEOM_VBO_MAPPED 2
87 struct _cairo_gpu_geometry
103 struct _cairo_gpu_subspace
105 cairo_gpu_subspace_t
* next
;
106 pthread_key_t context_tls
;
112 GLXFBConfig fbconfig
;
113 GLXDrawable dummy_drawable
;
114 char dummy_drawable_is_window
;
119 #define TABLE_FRAG (0 << 30)
120 #define TABLE_VERT (1 << 30)
121 #define TABLE_FBCONFIG (2 << 30)
122 #define TABLE_MASK (3 << 30)
126 cairo_hash_entry_t base
;
128 } cairo_gpu_int_entry_t
;
132 cairo_hash_entry_t base
;
134 } cairo_gpu_ptr_entry_t
;;
141 cairo_glx_state_t glx
;
142 cairo_osmesa_state_t osmesa
;
144 } cairo_gpu_gl_state_t
;
146 #define MAX_TEXTURE_UNITS 6
148 typedef void* (*PFNGLGETPROCADDRESSPROC
) (const char*);
150 typedef void (APIENTRYP PFNGLCULLFACEPROC
) (GLenum mode
);
151 typedef void (APIENTRYP PFNGLFRONTFACEPROC
) (GLenum mode
);
152 typedef void (APIENTRYP PFNGLHINTPROC
) (GLenum target
, GLenum mode
);
153 typedef void (APIENTRYP PFNGLLINEWIDTHPROC
) (GLfloat width
);
154 typedef void (APIENTRYP PFNGLPOINTSIZEPROC
) (GLfloat size
);
155 typedef void (APIENTRYP PFNGLPOLYGONMODEPROC
) (GLenum face
, GLenum mode
);
156 typedef void (APIENTRYP PFNGLSCISSORPROC
) (GLint x
, GLint y
, GLsizei width
, GLsizei height
);
157 typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC
) (GLenum target
, GLenum pname
, GLfloat param
);
158 typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC
) (GLenum target
, GLenum pname
, const GLfloat
*params
);
159 typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC
) (GLenum target
, GLenum pname
, GLint param
);
160 typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC
) (GLenum target
, GLenum pname
, const GLint
*params
);
161 typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC
) (GLenum target
, GLint level
, GLint internalformat
, GLsizei width
, GLint border
, GLenum format
, GLenum type
, const GLvoid
*pixels
);
162 typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC
) (GLenum target
, GLint level
, GLint internalformat
, GLsizei width
, GLsizei height
, GLint border
, GLenum format
, GLenum type
, const GLvoid
*pixels
);
163 typedef void (APIENTRYP PFNGLDRAWBUFFERPROC
) (GLenum mode
);
164 typedef void (APIENTRYP PFNGLCLEARPROC
) (GLbitfield mask
);
165 typedef void (APIENTRYP PFNGLCLEARCOLORPROC
) (GLclampf red
, GLclampf green
, GLclampf blue
, GLclampf alpha
);
166 typedef void (APIENTRYP PFNGLCLEARSTENCILPROC
) (GLint s
);
167 typedef void (APIENTRYP PFNGLCLEARDEPTHPROC
) (GLclampd depth
);
168 typedef void (APIENTRYP PFNGLSTENCILMASKPROC
) (GLuint mask
);
169 typedef void (APIENTRYP PFNGLCOLORMASKPROC
) (GLboolean red
, GLboolean green
, GLboolean blue
, GLboolean alpha
);
170 typedef void (APIENTRYP PFNGLDEPTHMASKPROC
) (GLboolean flag
);
171 typedef void (APIENTRYP PFNGLDISABLEPROC
) (GLenum cap
);
172 typedef void (APIENTRYP PFNGLENABLEPROC
) (GLenum cap
);
173 typedef void (APIENTRYP PFNGLFINISHPROC
) (void);
174 typedef void (APIENTRYP PFNGLFLUSHPROC
) (void);
175 typedef void (APIENTRYP PFNGLBLENDFUNCPROC
) (GLenum sfactor
, GLenum dfactor
);
176 typedef void (APIENTRYP PFNGLLOGICOPPROC
) (GLenum opcode
);
177 typedef void (APIENTRYP PFNGLSTENCILFUNCPROC
) (GLenum func
, GLint ref
, GLuint mask
);
178 typedef void (APIENTRYP PFNGLSTENCILOPPROC
) (GLenum fail
, GLenum zfail
, GLenum zpass
);
179 typedef void (APIENTRYP PFNGLDEPTHFUNCPROC
) (GLenum func
);
180 typedef void (APIENTRYP PFNGLPIXELSTOREFPROC
) (GLenum pname
, GLfloat param
);
181 typedef void (APIENTRYP PFNGLPIXELSTOREIPROC
) (GLenum pname
, GLint param
);
182 typedef void (APIENTRYP PFNGLREADBUFFERPROC
) (GLenum mode
);
183 typedef void (APIENTRYP PFNGLREADPIXELSPROC
) (GLint x
, GLint y
, GLsizei width
, GLsizei height
, GLenum format
, GLenum type
, GLvoid
*pixels
);
184 typedef void (APIENTRYP PFNGLGETBOOLEANVPROC
) (GLenum pname
, GLboolean
*params
);
185 typedef void (APIENTRYP PFNGLGETDOUBLEVPROC
) (GLenum pname
, GLdouble
*params
);
186 typedef GLenum (APIENTRYP PFNGLGETERRORPROC
) (void);
187 typedef void (APIENTRYP PFNGLGETFLOATVPROC
) (GLenum pname
, GLfloat
*params
);
188 typedef void (APIENTRYP PFNGLGETINTEGERVPROC
) (GLenum pname
, GLint
*params
);
189 typedef const GLubyte
* (APIENTRYP PFNGLGETSTRINGPROC
) (GLenum name
);
190 typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC
) (GLenum target
, GLint level
, GLenum format
, GLenum type
, GLvoid
*pixels
);
191 typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC
) (GLenum target
, GLenum pname
, GLfloat
*params
);
192 typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC
) (GLenum target
, GLenum pname
, GLint
*params
);
193 typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC
) (GLenum target
, GLint level
, GLenum pname
, GLfloat
*params
);
194 typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC
) (GLenum target
, GLint level
, GLenum pname
, GLint
*params
);
195 typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC
) (GLenum cap
);
196 typedef void (APIENTRYP PFNGLDEPTHRANGEPROC
) (GLclampd near
, GLclampd far
);
197 typedef void (APIENTRYP PFNGLVIEWPORTPROC
) (GLint x
, GLint y
, GLsizei width
, GLsizei height
);
199 typedef void (APIENTRYP PFNGLCOLORPOINTERPROC
) (GLint size
, GLenum type
, GLsizei stride
, const GLvoid
*pointer
);
200 typedef void (APIENTRYP PFNGLTEXCOORDPOINTERPROC
) (GLint size
, GLenum type
, GLsizei stride
, const GLvoid
*pointer
);
201 typedef void (APIENTRYP PFNGLVERTEXPOINTERPROC
) (GLint size
, GLenum type
, GLsizei stride
, const GLvoid
*pointer
);
203 typedef void (APIENTRYP PFNGLCOLOR4FVPROC
)(const GLfloat
*v
);
204 typedef void (APIENTRYP PFNGLCOPYPIXELSPROC
)(GLint x
, GLint y
, GLsizei width
, GLsizei height
, GLenum type
);
205 typedef void (APIENTRYP PFNGLENABLECLIENTSTATEPROC
)(GLenum array
);
206 typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEPROC
)(GLenum array
);
207 typedef void (APIENTRYP PFNGLDRAWPIXELSPROC
)(GLsizei width
, GLsizei height
, GLenum format
, GLenum type
, const GLvoid
*pixels
);
208 typedef void (APIENTRYP PFNGLLOADIDENTITYPROC
)(void);
209 typedef void (APIENTRYP PFNGLLOADMATRIXFPROC
)(const GLfloat
* m
);
210 typedef void (APIENTRYP PFNGLLOADMATRIXDPROC
)(const GLdouble
* m
);
211 typedef void (APIENTRYP PFNGLMATRIXMODEPROC
)(GLenum mode
);
212 typedef void (APIENTRYP PFNGLORTHOPROC
)(GLdouble left
, GLdouble right
, GLdouble bottom
, GLdouble top
, GLdouble zNear
, GLdouble zFar
);
213 typedef void (APIENTRYP PFNGLPIXELMAPFVPROC
) (GLenum map
, GLsizei mapsize
, const GLfloat
*values
);
214 typedef void (APIENTRYP PFNGLPIXELTRANSFERFPROC
) (GLenum pname
, GLfloat param
);
215 typedef void (APIENTRYP PFNGLPIXELZOOMPROC
) (GLfloat xfactor
, GLfloat yfactor
);
216 typedef void (APIENTRYP PFNGLRASTERPOS2IPROC
) (GLint x
, GLint y
);
217 typedef void (APIENTRYP PFNGLRECTIPROC
) (GLint x1
, GLint y1
, GLint x2
, GLint y2
);
218 typedef void (APIENTRYP PFNGLTEXENVFVPROC
) (GLenum target
, GLenum pname
, const GLfloat
*params
);
219 typedef void (APIENTRYP PFNGLTEXENVIPROC
) (GLenum target
, GLenum pname
, GLint param
);
220 typedef void (APIENTRYP PFNGLTEXGENFVPROC
) (GLenum coord
, GLenum pname
, const GLfloat
*params
);
221 typedef void (APIENTRYP PFNGLTEXGENIPROC
) (GLenum coord
, GLenum pname
, GLint param
);
222 typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC
) (GLenum target
, GLint level
, GLint xoffset
, GLint yoffset
, GLsizei width
, GLsizei height
, GLenum format
, GLenum type
, const GLvoid
*pixels
);
223 typedef void (APIENTRYP PFNGLTRANSLATEDPROC
) (GLdouble x
, GLdouble y
, GLdouble z
);
224 typedef void (APIENTRYP PFNGLTRANSLATEFPROC
) (GLfloat x
, GLfloat y
, GLfloat z
);
228 PFNGLACTIVETEXTUREARBPROC ActiveTextureARB
;
229 PFNGLBINDBUFFERARBPROC BindBufferARB
;
230 PFNGLBINDFRAMEBUFFEREXTPROC BindFramebufferEXT
;
231 PFNGLBINDPROGRAMARBPROC BindProgramARB
;
232 PFNGLBINDRENDERBUFFEREXTPROC BindRenderbufferEXT
;
233 PFNGLBINDTEXTUREEXTPROC BindTextureEXT
;
234 PFNGLBINDVERTEXARRAYPROC BindVertexArray
;
235 PFNGLBLENDCOLOREXTPROC BlendColorEXT
;
236 PFNGLBLENDEQUATIONPROC BlendEquation
;
237 PFNGLBLENDFUNCPROC BlendFunc
;
238 PFNGLBLENDFUNCSEPARATEEXTPROC BlendFuncSeparateEXT
;
239 PFNGLBLITFRAMEBUFFEREXTPROC BlitFramebufferEXT
;
240 PFNGLBUFFERDATAARBPROC BufferDataARB
;
241 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC CheckFramebufferStatusEXT
;
242 PFNGLCLEARCOLORPROC ClearColor
;
243 PFNGLCLEARPROC Clear
;
244 PFNGLCLIENTACTIVETEXTUREARBPROC ClientActiveTextureARB
;
245 PFNGLCOLOR4FVPROC Color4fv
;
246 PFNGLCOLORMASKPROC ColorMask
;
247 PFNGLCOLORPOINTERPROC ColorPointer
;
248 PFNGLCOPYPIXELSPROC CopyPixels
;
249 PFNGLCOPYTEXSUBIMAGE2DEXTPROC CopyTexSubImage2DEXT
;
250 PFNGLDELETEBUFFERSARBPROC DeleteBuffersARB
;
251 PFNGLDELETEFRAMEBUFFERSEXTPROC DeleteFramebuffersEXT
;
252 PFNGLDELETEPROGRAMSARBPROC DeleteProgramsARB
;
253 PFNGLDELETERENDERBUFFERSEXTPROC DeleteRenderbuffersEXT
;
254 PFNGLDELETETEXTURESEXTPROC DeleteTexturesEXT
;
255 PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays
;
256 PFNGLDISABLECLIENTSTATEPROC DisableClientState
;
257 PFNGLDISABLEPROC Disable
;
258 PFNGLDRAWARRAYSEXTPROC DrawArraysEXT
;
259 PFNGLDRAWBUFFERPROC DrawBuffer
;
260 PFNGLDRAWPIXELSPROC DrawPixels
;
261 PFNGLENABLECLIENTSTATEPROC EnableClientState
;
262 PFNGLENABLEPROC Enable
;
263 PFNGLENABLEVERTEXATTRIBARRAYARBPROC EnableVertexAttribArrayARB
;
264 PFNGLFINISHPROC Finish
;
265 PFNGLFLUSHPROC Flush
;
266 PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC FramebufferRenderbufferEXT
;
267 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC FramebufferTexture2DEXT
;
268 PFNGLGENBUFFERSARBPROC GenBuffersARB
;
269 PFNGLGENERATEMIPMAPEXTPROC GenerateMipmapEXT
;
270 PFNGLGENFRAMEBUFFERSEXTPROC GenFramebuffersEXT
;
271 PFNGLGENPROGRAMSARBPROC GenProgramsARB
;
272 PFNGLGENRENDERBUFFERSEXTPROC GenRenderbuffersEXT
;
273 PFNGLGENTEXTURESEXTPROC GenTexturesEXT
;
274 PFNGLGENVERTEXARRAYSPROC GenVertexArrays
;
275 PFNGLGETERRORPROC GetError
;
276 PFNGLGETFLOATVPROC GetFloatv
;
277 PFNGLGETSTRINGPROC GetString
;
278 PFNGLGETTEXIMAGEPROC GetTexImage
;
280 PFNGLLOADIDENTITYPROC LoadIdentity
;
281 PFNGLLOADMATRIXDPROC LoadMatrixd
;
282 PFNGLLOADMATRIXDPROC LoadMatrixf
;
283 PFNGLMAPBUFFERARBPROC MapBufferARB
;
284 PFNGLMAPBUFFERRANGEPROC MapBufferRange
;
285 PFNGLMATRIXMODEPROC MatrixMode
;
286 PFNGLORTHOPROC Ortho
;
287 PFNGLPIXELMAPFVPROC PixelMapfv
;
288 PFNGLPIXELSTOREIPROC PixelStorei
;
289 PFNGLPIXELTRANSFERFPROC PixelTransferf
;
290 PFNGLPIXELZOOMPROC PixelZoom
;
291 PFNGLPROGRAMENVPARAMETER4FVARBPROC ProgramEnvParameter4fvARB
;
292 PFNGLPROGRAMSTRINGARBPROC ProgramStringARB
;
293 PFNGLRASTERPOS2IPROC RasterPos2i
;
294 PFNGLREADBUFFERPROC ReadBuffer
;
295 PFNGLREADPIXELSPROC ReadPixels
;
296 PFNGLRECTIPROC Recti
;
297 PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC RenderbufferStorageMultisampleCoverageNV
;
298 PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC RenderbufferStorageMultisampleEXT
;
299 PFNGLSCISSORPROC Scissor
;
300 PFNGLTEXCOORDPOINTERPROC TexCoordPointer
;
301 PFNGLTEXENVFVPROC TexEnvfv
;
302 PFNGLTEXENVIPROC TexEnvi
;
303 PFNGLTEXGENFVPROC TexGenfv
;
304 PFNGLTEXGENIPROC TexGeni
;
305 PFNGLTEXIMAGE2DPROC TexImage2D
;
306 PFNGLTEXPARAMETERIPROC TexParameteri
;
307 PFNGLTEXSUBIMAGE2DPROC TexSubImage2D
;
308 PFNGLTRANSLATEDPROC Translated
;
309 PFNGLTRANSLATEFPROC Translatef
;
310 PFNGLUNMAPBUFFERARBPROC UnmapBufferARB
;
311 PFNGLVERTEXPOINTERPROC VertexPointer
;
312 PFNGLVIEWPORTPROC Viewport
;
313 PFNGLWINDOWPOS2IPROC WindowPos2i
;
316 struct _cairo_gpu_space
318 CAIRO_GPU_BASE_SPACE_T
;
321 PFNGLGETPROCADDRESSPROC GetProcAddress
;
323 cairo_gpu_subspace_t subspace
;
326 unsigned char fb_blit
: 1;
327 unsigned char use_frag_prog
: 1;
328 unsigned char use_vert_prog
: 1;
329 unsigned char use_vbo
: 1;
330 unsigned char has_window_pos
: 1;
331 unsigned char has_framebuffer_multisample
: 1;
332 unsigned char has_framebuffer_multisample_coverage
: 1;
333 unsigned char has_fragment_program2
: 1;
334 unsigned char has_gpu_program4
: 1;
335 unsigned char crossbar
: 1;
336 unsigned char destroy_on_unbind
: 1;
337 unsigned char owns_libgl
: 1;
341 cairo_osmesa_t osmesa
;
345 cairo_hash_table_t
* table
;
348 struct _cairo_gpu_space_tls
350 CAIRO_GPU_BASE_SPACE_TLS_T
;
351 cairo_gpu_context_t
* last_context
;
352 cairo_gpu_context_t
* contexts
;
356 struct _cairo_gpu_context
358 cairo_gpu_space_t
* space
;
359 cairo_gpu_subspace_t
* subspace
;
360 cairo_gpu_space_tls_t
* tls
;
361 cairo_gpu_context_t
* next
; /* in per-thread contexts list */
374 GLXDrawable current_drawable
;
385 cairo_gpu_texture_t
* texture
;
387 unsigned active_target_idx
;
388 unsigned enabled_target
;
389 unsigned nv_texture_shader
;
390 } textures
[MAX_TEXTURE_UNITS
];
392 unsigned char active_texture
;
395 unsigned char smooth
;
396 unsigned char smooth_hint
; // unknown / nicest / fastest
397 unsigned char blend_eq
;
398 unsigned char color_mask
;
400 unsigned char vertex_array
: 1;
401 unsigned char color_array
: 1;
402 unsigned char tex_array
: 1;
403 unsigned char blend
: 1;
404 unsigned char init_frag_modulate
: 1;
405 unsigned char init_frag_combine
: 1;
406 unsigned char init_vert_fixed
: 1;
407 unsigned char fragp_enabled
: 1;
408 unsigned char vertp_enabled
: 1;
409 unsigned char destroy_on_unbind
: 1;
410 unsigned char component
: 2;
411 unsigned char tex2_src0_rgb_constant
: 1;
412 unsigned char nv_texture_shader
: 1;
413 unsigned char gl_inited
: 1;
420 cairo_gpu_color4_t color
;
422 int draw_flip_height
;
423 int read_flip_height
;
426 long long draw_fb_id
;
427 long long read_fb_id
;
428 unsigned draw_buffer
;
429 unsigned read_buffer
;
438 long long vao0_id
; // the geometry that was last setup for VAO 0
439 long long vbo_id
; // bound VBO
440 long long vao_id
; // bound VAO
447 _cairo_gpu_space_lookup(cairo_gpu_space_t
* space
, unsigned hash
)
449 cairo_hash_entry_t entry
;
453 CAIRO_MUTEX_LOCK(space
->mutex
);
454 p
= _cairo_hash_table_lookup(space
->table
, &entry
);
455 CAIRO_MUTEX_UNLOCK(space
->mutex
);
459 // OpenGL windows have "upside-down" coordinaties: the projection matrix normally handles this, but here it is not used. So we flip y manually.
461 _cairo_gpu_flip_draw_y(cairo_gpu_context_t
* ctx
, int* y
, int height
)
463 if(ctx
->draw_flip_height
>= 0)
465 *y
= ctx
->draw_flip_height
- *y
- height
;
472 _cairo_gpu_flip_read_y(cairo_gpu_context_t
* ctx
, int* y
, int height
)
474 if(ctx
->read_flip_height
>= 0)
476 *y
= ctx
->read_flip_height
- *y
- height
;
482 static inline unsigned
483 _cairo_gl_target(int idx
)
485 return idx
? GL_TEXTURE_RECTANGLE_ARB
: GL_TEXTURE_2D
;
488 static inline void _cairo_gpu_texture_fini(cairo_gpu_context_t
* ctx
, cairo_gpu_texture_t
* texture
)
491 ctx
->gl
.DeleteTexturesEXT(1, &texture
->tex
);
496 // you must fill target_idx
497 static inline void _cairo_gpu_texture_init(cairo_gpu_space_t
* space
, cairo_gpu_texture_t
* texture
, int width
, int height
)
501 texture
->wrap_s
= texture
->wrap_t
= GL_REPEAT
;
502 texture
->anisotropy
= 1.0;
503 texture
->non_upside_down
= 0;
505 if(space
->tex_npot
|| (is_pow2(width
) && is_pow2(height
)))
506 texture
->target_idx
= TARGET_2D
;
507 else if(space
->tex_rectangle
)
508 texture
->target_idx
= TARGET_RECTANGLE
;
511 texture
->target_idx
= TARGET_2D
;
512 width
= higher_pow2(width
- 1);
513 height
= higher_pow2(height
- 1);
516 texture
->width
= width
;
517 texture
->height
= height
;
520 static inline void _cairo_gpu_texture_realize(cairo_gpu_context_t
* ctx
, cairo_gpu_texture_t
* texture
)
522 texture
->id
= _cairo_id();
523 ctx
->gl
.GenTexturesEXT(1, &texture
->tex
);
526 // you must fill target_idx
527 static inline void _cairo_gpu_texture_create(cairo_gpu_context_t
* ctx
, cairo_gpu_texture_t
* texture
, int width
, int height
)
529 _cairo_gpu_texture_init(ctx
->space
, texture
, width
, height
);
530 _cairo_gpu_texture_realize(ctx
, texture
);
535 _cairo_gpu_texture_adjust_matrix(cairo_gpu_texture_t
* texture
, cairo_matrix_t
* matrix
)
537 if(texture
->non_upside_down
)
539 matrix
->xx
= -matrix
->xx
;
540 matrix
->xy
= -matrix
->xy
;
541 matrix
->x0
= texture
->width
- matrix
->x0
;
543 matrix
->yx
= -matrix
->yx
;
544 matrix
->yy
= -matrix
->yy
;
545 matrix
->y0
= texture
->height
- matrix
->y0
;
548 if(texture
->target_idx
== TARGET_2D
)
550 double xm
= 1.0 / texture
->width
;
551 double ym
= 1.0 / texture
->height
;
564 _cairo_gpu_surface_use_msaa(cairo_gpu_surface_t
* surface
)
566 return surface
->want_msaa
&& surface
->msaa_fb
;