Add stubs for Direct3D9 backend.
[cairo/gpu.git] / src / gpu / cairo-gpu-impl-defs-gl.h
blobae321485c5eeb338ca5a01967c4ae275286e8200
1 // XXX: we rely on __attribute__((weak)), which is probably non-portable to Windows
3 //#ifdef HAVE_X11
4 #define extern extern __attribute__((weak))
5 #include <X11/extensions/Xrender.h>
6 #undef extern
7 //#endif
9 #include <GL/gl.h>
10 #include <GL/glext.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;
24 unsigned tex;
25 long long id;
26 unsigned filter;
27 unsigned wrap_s;
28 unsigned wrap_t;
29 float anisotropy;
30 char non_upside_down;
33 struct _cairo_gpu_subspace;
34 typedef struct _cairo_gpu_subspace cairo_gpu_subspace_t;
36 #define MAX_SURFS 4
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;
45 union
47 struct
49 GLXFBConfig fbconfig;
50 Drawable xdrawable;
51 GLXDrawable glxdrawable;
52 char fbconfig_alpha_size;
53 char fbconfig_color_size;
54 char owns_glx_pixmap;
55 char owns_pbuffer;
56 char fbconfig_double_buffered;
57 cairo_gpu_texture_t bound_texture;
58 int bound_image_ref;
59 } glx;
62 cairo_gpu_texture_t texture;
63 GLuint fb;
65 GLuint msaa_rb;
66 GLuint msaa_fb;
67 long long msaa_id;
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;
77 #define API_NONE 0
78 #define API_OSMESA 1
79 #define API_EGL 2
80 #define API_GLX 3
81 #define API_AGL 4
82 #define API_WGL 5
84 #define GEOM_SETUP 1
85 #define GEOM_VBO_MAPPED 2
87 struct _cairo_gpu_geometry
89 unsigned mode;
90 unsigned char flags;
91 unsigned char vert;
92 unsigned char tex;
93 unsigned char color;
94 unsigned vao;
95 unsigned vbo;
96 long long id;
97 unsigned vbo_size;
98 unsigned data_size;
99 unsigned count;
100 void *data;
103 struct _cairo_gpu_subspace
105 cairo_gpu_subspace_t* next;
106 pthread_key_t context_tls;
108 union
110 struct
112 GLXFBConfig fbconfig;
113 GLXDrawable dummy_drawable;
114 char dummy_drawable_is_window;
115 } glx;
119 #define TABLE_FRAG (0 << 30)
120 #define TABLE_VERT (1 << 30)
121 #define TABLE_FBCONFIG (2 << 30)
122 #define TABLE_MASK (3 << 30)
124 typedef struct
126 cairo_hash_entry_t base;
127 unsigned v;
128 } cairo_gpu_int_entry_t;
130 typedef struct
132 cairo_hash_entry_t base;
133 void* v;
134 } cairo_gpu_ptr_entry_t;;
136 typedef struct
138 char api;
139 union
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);
226 typedef struct
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;
279 PFNGLHINTPROC Hint;
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;
314 } cairo_gpu_gl_t;
316 struct _cairo_gpu_space
318 CAIRO_GPU_BASE_SPACE_T;
320 void* libgl;
321 PFNGLGETPROCADDRESSPROC GetProcAddress;
323 cairo_gpu_subspace_t subspace;
325 unsigned char api;
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;
339 union
341 cairo_osmesa_t osmesa;
342 cairo_glx_t glx;
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;
355 // subspace_tls
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 */
363 cairo_gpu_gl_t gl;
365 union
367 struct
369 OSMesaContext ctx;
370 } osmesa;
371 struct
373 GLXContext ctx;
374 GLXDrawable current_drawable;
375 } glx;
378 // copy of GL state
379 struct
381 struct
383 unsigned tex;
384 long long id;
385 cairo_gpu_texture_t* texture;
386 } targets[2];
387 unsigned active_target_idx;
388 unsigned enabled_target;
389 unsigned nv_texture_shader;
390 } textures[MAX_TEXTURE_UNITS];
391 char constant_unit;
392 unsigned char active_texture;
394 unsigned blend_func;
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;
415 unsigned frag;
416 unsigned vert;
417 unsigned fragp;
418 unsigned vertp;
420 cairo_gpu_color4_t color;
422 int draw_flip_height;
423 int read_flip_height;
424 GLuint draw_fb;
425 GLuint read_fb;
426 long long draw_fb_id;
427 long long read_fb_id;
428 unsigned draw_buffer;
429 unsigned read_buffer;
430 int viewport_x;
431 int viewport_y;
432 int viewport_width;
433 int viewport_height;
434 int x_offset;
435 int y_offset;
436 int proj_sign;
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
442 unsigned mode;
443 unsigned count;
446 static inline void*
447 _cairo_gpu_space_lookup(cairo_gpu_space_t* space, unsigned hash)
449 cairo_hash_entry_t entry;
450 void* p;
451 entry.hash = hash;
453 CAIRO_MUTEX_LOCK(space->mutex);
454 p = _cairo_hash_table_lookup(space->table, &entry);
455 CAIRO_MUTEX_UNLOCK(space->mutex);
456 return p;
459 // OpenGL windows have "upside-down" coordinaties: the projection matrix normally handles this, but here it is not used. So we flip y manually.
460 static inline int
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;
466 return -height;
468 return height;
471 static inline int
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;
477 return -height;
479 return 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)
490 if(texture->tex)
491 ctx->gl.DeleteTexturesEXT(1, &texture->tex);
492 texture->tex = 0;
493 texture->id = 0;
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)
499 texture->tex = 0;
500 texture->filter = 0;
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;
509 else
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);
534 static inline void
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;
553 matrix->xx *= xm;
554 matrix->xy *= xm;
555 matrix->x0 *= xm;
557 matrix->yx *= ym;
558 matrix->yy *= ym;
559 matrix->y0 *= ym;
563 static inline int
564 _cairo_gpu_surface_use_msaa(cairo_gpu_surface_t * surface)
566 return surface->want_msaa && surface->msaa_fb;