diff --git a/cogl/cogl/cogl-atlas.c b/cogl/cogl/cogl-atlas.c index b78bcf9d7..658c65e44 100644 --- a/cogl/cogl/cogl-atlas.c +++ b/cogl/cogl/cogl-atlas.c @@ -193,6 +193,8 @@ _cogl_atlas_get_initial_size (CoglContext *ctx, unsigned int *map_width, unsigned int *map_height) { + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); unsigned int size; GLenum gl_intformat; GLenum gl_format; @@ -219,12 +221,13 @@ _cogl_atlas_get_initial_size (CoglContext *ctx, /* Some platforms might not support this large size so we'll decrease the size until it can */ while (size > 1 && - !ctx->texture_driver->size_supported (ctx, - GL_TEXTURE_2D, - gl_intformat, - gl_format, - gl_type, - size, size)) + !tex_driver->size_supported (ctx->texture_driver, + ctx, + GL_TEXTURE_2D, + gl_intformat, + gl_format, + gl_type, + size, size)) size >>= 1; *map_width = size; @@ -239,6 +242,8 @@ _cogl_atlas_create_map (CoglContext *ctx, unsigned int n_textures, CoglAtlasRepositionData *textures) { + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); GLenum gl_intformat; GLenum gl_format; GLenum gl_type; @@ -251,12 +256,13 @@ _cogl_atlas_create_map (CoglContext *ctx, /* Keep trying increasingly larger atlases until we can fit all of the textures */ - while (ctx->texture_driver->size_supported (ctx, - GL_TEXTURE_2D, - gl_intformat, - gl_format, - gl_type, - map_width, map_height)) + while (tex_driver->size_supported (ctx->texture_driver, + ctx, + GL_TEXTURE_2D, + gl_intformat, + gl_format, + gl_type, + map_width, map_height)) { CoglRectangleMap *new_atlas = _cogl_rectangle_map_new (map_width, map_height, diff --git a/cogl/cogl/cogl-context-private.h b/cogl/cogl/cogl-context-private.h index 3ad13ea8d..ffd8979ac 100644 --- a/cogl/cogl/cogl-context-private.h +++ b/cogl/cogl/cogl-context-private.h @@ -73,7 +73,7 @@ struct _CoglContext /* vtables for the driver functions */ const CoglDriverVtable *driver_vtable; - const CoglTextureDriver *texture_driver; + CoglTextureDriver *texture_driver; void *driver_context; diff --git a/cogl/cogl/cogl-context.c b/cogl/cogl/cogl-context.c index 21b304991..a54b87888 100644 --- a/cogl/cogl/cogl-context.c +++ b/cogl/cogl/cogl-context.c @@ -462,7 +462,10 @@ gboolean cogl_context_format_supports_upload (CoglContext *ctx, CoglPixelFormat format) { - return ctx->texture_driver->format_supports_upload (ctx, format); + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); + + return tex_driver->format_supports_upload (ctx->texture_driver, ctx, format); } void diff --git a/cogl/cogl/cogl-renderer-private.h b/cogl/cogl/cogl-renderer-private.h index 8f8aa8ec1..7a73ab05d 100644 --- a/cogl/cogl/cogl-renderer-private.h +++ b/cogl/cogl/cogl-renderer-private.h @@ -49,7 +49,7 @@ struct _CoglRenderer gboolean connected; CoglDriver driver_override; const CoglDriverVtable *driver_vtable; - const CoglTextureDriver *texture_driver; + CoglTextureDriver *texture_driver; const CoglWinsysVtable *winsys_vtable; void *custom_winsys_user_data; CoglCustomWinsysVtableGetter custom_winsys_vtable_getter; diff --git a/cogl/cogl/cogl-renderer.c b/cogl/cogl/cogl-renderer.c index f5a38e37d..253bb248a 100644 --- a/cogl/cogl/cogl-renderer.c +++ b/cogl/cogl/cogl-renderer.c @@ -53,16 +53,21 @@ #include "cogl/winsys/cogl-winsys-glx-private.h" #endif +#ifdef HAVE_GL +#include "cogl/driver/gl/gl/cogl-texture-driver-gl3-private.h" +#endif +#ifdef HAVE_GLES2 +#include "cogl/driver/gl/gles/cogl-texture-driver-gles2-private.h" +#endif + #ifdef HAVE_X11 #include "cogl/cogl-xlib-renderer.h" #endif #ifdef HAVE_GL -extern const CoglTextureDriver _cogl_texture_driver_gl; extern const CoglDriverVtable _cogl_driver_gl; #endif #ifdef HAVE_GLES2 -extern const CoglTextureDriver _cogl_texture_driver_gles; extern const CoglDriverVtable _cogl_driver_gles; #endif @@ -79,7 +84,6 @@ typedef struct _CoglDriverDescription * driver. */ const CoglPrivateFeature private_features[8]; const CoglDriverVtable *vtable; - const CoglTextureDriver *texture_driver; const char *libgl_name; } CoglDriverDescription; @@ -92,7 +96,6 @@ static CoglDriverDescription _cogl_drivers[] = { COGL_PRIVATE_FEATURE_ANY_GL, -1 }, &_cogl_driver_gl, - &_cogl_texture_driver_gl, COGL_GL_LIBNAME, }, #endif @@ -103,7 +106,6 @@ static CoglDriverDescription _cogl_drivers[] = { COGL_PRIVATE_FEATURE_ANY_GL, -1 }, &_cogl_driver_gles, - &_cogl_texture_driver_gles, COGL_GLES2_LIBNAME, }, #endif @@ -112,7 +114,6 @@ static CoglDriverDescription _cogl_drivers[] = "nop", { -1 }, &_cogl_driver_nop, - NULL, /* texture driver */ NULL /* libgl_name */ } }; @@ -165,6 +166,8 @@ cogl_renderer_dispose (GObject *object) g_slist_free_full (renderer->event_filters, (GDestroyNotify) native_filter_closure_free); + g_clear_object (&renderer->texture_driver); + G_OBJECT_CLASS (cogl_renderer_parent_class)->dispose (object); } @@ -374,7 +377,26 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer, desc = state.driver_description; renderer->driver = desc->id; renderer->driver_vtable = desc->vtable; - renderer->texture_driver = desc->texture_driver; + + switch (renderer->driver) + { +#ifdef HAVE_GL + case COGL_DRIVER_GL3: + renderer->texture_driver = g_object_new (COGL_TYPE_TEXTURE_DRIVER_GL3, NULL); + break; +#endif +#ifdef HAVE_GLES2 + case COGL_DRIVER_GLES2: + renderer->texture_driver = g_object_new (COGL_TYPE_TEXTURE_DRIVER_GLES2, NULL); + break; +#endif + + case COGL_DRIVER_NOP: + default: + renderer->texture_driver = NULL; + break; + } + libgl_name = desc->libgl_name; memset(renderer->private_features, 0, sizeof (renderer->private_features)); diff --git a/cogl/cogl/cogl-texture-driver.c b/cogl/cogl/cogl-texture-driver.c new file mode 100644 index 000000000..71d58e5ff --- /dev/null +++ b/cogl/cogl/cogl-texture-driver.c @@ -0,0 +1,45 @@ +/* + * Cogl + * + * A Low Level GPU Graphics and Utilities API + * + * Copyright (C) 2024 Red Hat. + * + * 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, sublicense, 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 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 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * 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. + * + */ + +#include "config.h" + +#include "cogl/cogl-texture-driver.h" + +G_DEFINE_ABSTRACT_TYPE (CoglTextureDriver, cogl_texture_driver, G_TYPE_OBJECT) + + +static void +cogl_texture_driver_class_init (CoglTextureDriverClass *klass) +{ +} + +static void +cogl_texture_driver_init (CoglTextureDriver *driver) +{ +} diff --git a/cogl/cogl/cogl-texture-driver.h b/cogl/cogl/cogl-texture-driver.h index 1759a8bad..220096755 100644 --- a/cogl/cogl/cogl-texture-driver.h +++ b/cogl/cogl/cogl-texture-driver.h @@ -30,19 +30,33 @@ #pragma once -typedef struct _CoglTextureDriver CoglTextureDriver; +#include -struct _CoglTextureDriver +#include "cogl/cogl-gl-header.h" +#include "cogl/cogl-pixel-format.h" +#include "cogl/cogl-types.h" + +G_DECLARE_DERIVABLE_TYPE (CoglTextureDriver, + cogl_texture_driver, + COGL, + TEXTURE_DRIVER, + GObject) + +#define COGL_TYPE_TEXTURE_DRIVER (cogl_texture_driver_get_type ()) + +struct _CoglTextureDriverClass { + GObjectClass parent_class; + /* * A very small wrapper around glGenTextures() that ensures we default to * non-mipmap filters when creating textures. This is to save some memory as * the driver will not allocate room for the mipmap tree. */ - GLuint - (* gen) (CoglContext *ctx, - GLenum gl_target, - CoglPixelFormat internal_format); + GLuint (* gen) (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + CoglPixelFormat internal_format); /* * This uploads a sub-region from source_bmp to a single GL texture @@ -57,20 +71,20 @@ struct _CoglTextureDriver * * XXX: sorry for the ridiculous number of arguments :-( */ - gboolean - (* upload_subregion_to_gl) (CoglContext *ctx, - CoglTexture *texture, - int src_x, - int src_y, - int dst_x, - int dst_y, - int width, - int height, - int level, - CoglBitmap *source_bmp, - GLuint source_gl_format, - GLuint source_gl_type, - GError **error); + gboolean (* upload_subregion_to_gl) (CoglTextureDriver *driver, + CoglContext *ctx, + CoglTexture *texture, + int src_x, + int src_y, + int dst_x, + int dst_y, + int width, + int height, + int level, + CoglBitmap *source_bmp, + GLuint source_gl_format, + GLuint source_gl_type, + GError **error); /* * Replaces the contents of the GL texture with the entire bitmap. On @@ -78,15 +92,15 @@ struct _CoglTextureDriver * to copy the bitmap if the rowstride is not a multiple of a possible * alignment value because there is no GL_UNPACK_ROW_LENGTH */ - gboolean - (* upload_to_gl) (CoglContext *ctx, - GLenum gl_target, - GLuint gl_handle, - CoglBitmap *source_bmp, - GLint internal_gl_format, - GLuint source_gl_format, - GLuint source_gl_type, - GError **error); + gboolean (* upload_to_gl) (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + GLuint gl_handle, + CoglBitmap *source_bmp, + GLint internal_gl_format, + GLuint source_gl_format, + GLuint source_gl_type, + GError **error); /* * This sets up the glPixelStore state for an download to a destination with @@ -95,11 +109,11 @@ struct _CoglTextureDriver /* NB: GLES can't download pixel data into a sub region of a larger * destination buffer, the GL driver has a more flexible version of * this function that it uses internally. */ - void - (* prep_gl_for_pixels_download) (CoglContext *ctx, - int image_width, - int pixels_rowstride, - int pixels_bpp); + void (* prep_gl_for_pixels_download) (CoglTextureDriver *driver, + CoglContext *ctx, + int image_width, + int pixels_rowstride, + int pixels_bpp); /* * This driver abstraction is needed because GLES doesn't support @@ -108,29 +122,29 @@ struct _CoglTextureDriver * renders the texture and reads it back from the framebuffer. (See * _cogl_texture_draw_and_read () ) */ - gboolean - (* gl_get_tex_image) (CoglContext *ctx, - GLenum gl_target, - GLenum dest_gl_format, - GLenum dest_gl_type, - uint8_t *dest); + gboolean (* gl_get_tex_image) (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + GLenum dest_gl_format, + GLenum dest_gl_type, + uint8_t *dest); /* * It may depend on the driver as to what texture sizes are supported... */ - gboolean - (* size_supported) (CoglContext *ctx, - GLenum gl_target, - GLenum gl_intformat, - GLenum gl_format, - GLenum gl_type, - int width, - int height); + gboolean (* size_supported) (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + GLenum gl_intformat, + GLenum gl_format, + GLenum gl_type, + int width, + int height); - gboolean - (* format_supports_upload) (CoglContext *ctx, - CoglPixelFormat format); + gboolean (* format_supports_upload) (CoglTextureDriver *driver, + CoglContext *ctx, + CoglPixelFormat format); /* * The driver may impose constraints on what formats can be used to store @@ -138,9 +152,9 @@ struct _CoglTextureDriver * RGBA_8888, and so we need to manually convert the data if the final * destination has another format. */ - CoglPixelFormat - (* find_best_gl_get_data_format) (CoglContext *context, - CoglPixelFormat format, - GLenum *closest_gl_format, - GLenum *closest_gl_type); + CoglPixelFormat (* find_best_gl_get_data_format) (CoglTextureDriver *driver, + CoglContext *context, + CoglPixelFormat format, + GLenum *closest_gl_format, + GLenum *closest_gl_type); }; diff --git a/cogl/cogl/cogl-texture.c b/cogl/cogl/cogl-texture.c index ec8d52cad..9fca70ba4 100644 --- a/cogl/cogl/cogl-texture.c +++ b/cogl/cogl/cogl-texture.c @@ -811,6 +811,7 @@ cogl_texture_get_data (CoglTexture *texture, uint8_t *data) { CoglContext *ctx; + CoglTextureDriverClass *tex_driver; int bpp; int byte_size; CoglPixelFormat closest_format; @@ -848,11 +849,13 @@ cogl_texture_get_data (CoglTexture *texture, return byte_size; ctx = cogl_texture_get_context (texture); + tex_driver = COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); closest_format = - ctx->texture_driver->find_best_gl_get_data_format (ctx, - format, - &closest_gl_format, - &closest_gl_type); + tex_driver->find_best_gl_get_data_format (ctx->texture_driver, + ctx, + format, + &closest_gl_format, + &closest_gl_type); /* We can assume that whatever data GL gives us will have the premult status of the original texture */ diff --git a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c index 35f811100..86d264898 100644 --- a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c +++ b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c @@ -463,6 +463,8 @@ cogl_gl_framebuffer_read_pixels_into_bitmap (CoglFramebufferDriver *driver, int bpp, rowstride; uint8_t *tmp_data; gboolean succeeded; + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); if (_cogl_pixel_format_can_have_premult (read_format)) { @@ -480,10 +482,11 @@ cogl_gl_framebuffer_read_pixels_into_bitmap (CoglFramebufferDriver *driver, bpp = cogl_pixel_format_get_bytes_per_pixel (read_format, 0); rowstride = cogl_bitmap_get_rowstride (tmp_bmp); - ctx->texture_driver->prep_gl_for_pixels_download (ctx, - rowstride, - width, - bpp); + tex_driver->prep_gl_for_pixels_download (ctx->texture_driver, + ctx, + rowstride, + width, + bpp); /* Note: we don't worry about catching errors here since we know * we won't be lazily allocating storage for this buffer so it @@ -522,6 +525,8 @@ cogl_gl_framebuffer_read_pixels_into_bitmap (CoglFramebufferDriver *driver, gboolean succeeded = FALSE; uint8_t *pixels; GError *internal_error = NULL; + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); rowstride = cogl_bitmap_get_rowstride (bitmap); @@ -544,10 +549,11 @@ cogl_gl_framebuffer_read_pixels_into_bitmap (CoglFramebufferDriver *driver, bpp = cogl_pixel_format_get_bytes_per_pixel (bmp_format, 0); - ctx->texture_driver->prep_gl_for_pixels_download (ctx, - rowstride, - width, - bpp); + tex_driver->prep_gl_for_pixels_download (ctx->texture_driver, + ctx, + rowstride, + width, + bpp); pixels = _cogl_bitmap_gl_bind (shared_bmp, COGL_BUFFER_ACCESS_WRITE, diff --git a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c index c773cb623..65d32c6d4 100644 --- a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c +++ b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c @@ -78,6 +78,8 @@ _cogl_texture_2d_gl_can_create (CoglContext *ctx, int height, CoglPixelFormat internal_format) { + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); GLenum gl_intformat; GLenum gl_format; GLenum gl_type; @@ -93,13 +95,14 @@ _cogl_texture_2d_gl_can_create (CoglContext *ctx, &gl_type); /* Check that the driver can create a texture with that size */ - if (!ctx->texture_driver->size_supported (ctx, - GL_TEXTURE_2D, - gl_intformat, - gl_format, - gl_type, - width, - height)) + if (!tex_driver->size_supported (ctx->texture_driver, + ctx, + GL_TEXTURE_2D, + gl_intformat, + gl_format, + gl_type, + width, + height)) return FALSE; return TRUE; @@ -132,6 +135,8 @@ allocate_with_size (CoglTexture2D *tex_2d, int width = loader->src.sized.width; int height = loader->src.sized.height; CoglContext *ctx = cogl_texture_get_context (tex); + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); GLenum gl_intformat; GLenum gl_format; GLenum gl_type; @@ -158,7 +163,10 @@ allocate_with_size (CoglTexture2D *tex_2d, &gl_format, &gl_type); - gl_texture = ctx->texture_driver->gen (ctx, GL_TEXTURE_2D, internal_format); + gl_texture = tex_driver->gen (ctx->texture_driver, + ctx, + GL_TEXTURE_2D, + internal_format); tex_2d->gl_internal_format = gl_intformat; @@ -195,6 +203,8 @@ allocate_from_bitmap (CoglTexture2D *tex_2d, CoglTexture *tex = COGL_TEXTURE (tex_2d); CoglBitmap *bmp = loader->src.bitmap.bitmap; CoglContext *ctx = _cogl_bitmap_get_context (bmp); + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); CoglPixelFormat internal_format; int width = cogl_bitmap_get_width (bmp); int height = cogl_bitmap_get_height (bmp); @@ -235,16 +245,19 @@ allocate_from_bitmap (CoglTexture2D *tex_2d, NULL, NULL); - tex_2d->gl_texture = - ctx->texture_driver->gen (ctx, GL_TEXTURE_2D, internal_format); - if (!ctx->texture_driver->upload_to_gl (ctx, - GL_TEXTURE_2D, - tex_2d->gl_texture, - upload_bmp, - gl_intformat, - gl_format, - gl_type, - error)) + tex_2d->gl_texture = tex_driver->gen (ctx->texture_driver, + ctx, + GL_TEXTURE_2D, + internal_format); + if (!tex_driver->upload_to_gl (ctx->texture_driver, + ctx, + GL_TEXTURE_2D, + tex_2d->gl_texture, + upload_bmp, + gl_intformat, + gl_format, + gl_type, + error)) { g_object_unref (upload_bmp); return FALSE; @@ -270,9 +283,13 @@ allocate_from_egl_image (CoglTexture2D *tex_2d, CoglTexture *tex = COGL_TEXTURE (tex_2d); CoglContext *ctx = cogl_texture_get_context (tex); CoglPixelFormat internal_format = loader->src.egl_image.format; + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); - tex_2d->gl_texture = - ctx->texture_driver->gen (ctx, GL_TEXTURE_2D, internal_format); + tex_2d->gl_texture = tex_driver->gen (ctx->texture_driver, + ctx, + GL_TEXTURE_2D, + internal_format); if (!cogl_texture_2d_gl_bind_egl_image (tex_2d, loader->src.egl_image.image, @@ -567,6 +584,8 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d, { CoglTexture *tex = COGL_TEXTURE (tex_2d); CoglContext *ctx = cogl_texture_get_context (tex); + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); CoglBitmap *upload_bmp; CoglPixelFormat upload_format; GLenum gl_format; @@ -596,16 +615,17 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d, if (cogl_texture_get_max_level_set (tex) < level) cogl_texture_gl_set_max_level (tex, level); - status = ctx->texture_driver->upload_subregion_to_gl (ctx, - tex, - src_x, src_y, - dst_x, dst_y, - width, height, - level, - upload_bmp, - gl_format, - gl_type, - error); + status = tex_driver->upload_subregion_to_gl (ctx->texture_driver, + ctx, + tex, + src_x, src_y, + dst_x, dst_y, + width, height, + level, + upload_bmp, + gl_format, + gl_type, + error); g_object_unref (upload_bmp); @@ -625,6 +645,8 @@ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d, uint8_t *data) { CoglContext *ctx = cogl_texture_get_context (COGL_TEXTURE (tex_2d)); + CoglTextureDriverClass *tex_driver = + COGL_TEXTURE_DRIVER_GET_CLASS (ctx->texture_driver); uint8_t bpp; int width = cogl_texture_get_width (COGL_TEXTURE (tex_2d)); GLenum gl_format; @@ -641,17 +663,19 @@ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d, &gl_format, &gl_type); - ctx->texture_driver->prep_gl_for_pixels_download (ctx, - rowstride, - width, - bpp); + tex_driver->prep_gl_for_pixels_download (ctx->texture_driver, + ctx, + rowstride, + width, + bpp); _cogl_bind_gl_texture_transient (ctx, tex_2d->gl_target, tex_2d->gl_texture); - ctx->texture_driver->gl_get_tex_image (ctx, - tex_2d->gl_target, - gl_format, - gl_type, - data); + tex_driver->gl_get_tex_image (ctx->texture_driver, + ctx, + tex_2d->gl_target, + gl_format, + gl_type, + data); } diff --git a/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl3-private.h b/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl3-private.h new file mode 100644 index 000000000..6c3bc8828 --- /dev/null +++ b/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl3-private.h @@ -0,0 +1,40 @@ +/* + * Cogl + * + * A Low Level GPU Graphics and Utilities API + * + * Copyright (C) 2024 Red Hat. + * + * 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, sublicense, 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 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 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * 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. + */ + +#pragma once + +#include "cogl/cogl-texture-driver.h" + + +G_DECLARE_FINAL_TYPE (CoglTextureDriverGL3, + cogl_texture_driver_gl3, + COGL, + TEXTURE_DRIVER_GL3, + CoglTextureDriver) + +#define COGL_TYPE_TEXTURE_DRIVER_GL3 (cogl_texture_driver_gl3_get_type ()) diff --git a/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl3.c similarity index 73% rename from cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c rename to cogl/cogl/driver/gl/gl/cogl-texture-driver-gl3.c index c78d48e3f..806a24022 100644 --- a/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c +++ b/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl3.c @@ -42,6 +42,7 @@ #include "cogl/cogl-texture-private.h" #include "cogl/cogl-pipeline.h" #include "cogl/cogl-context-private.h" +#include "cogl/driver/gl/gl/cogl-texture-driver-gl3-private.h" #include "cogl/driver/gl/cogl-pipeline-opengl-private.h" #include "cogl/driver/gl/cogl-util-gl-private.h" #include "cogl/driver/gl/cogl-texture-gl-private.h" @@ -55,10 +56,20 @@ #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #endif +struct _CoglTextureDriverGL3 +{ + CoglTextureDriver parent_instance; +}; + +G_DEFINE_FINAL_TYPE (CoglTextureDriverGL3, + cogl_texture_driver_gl3, + COGL_TYPE_TEXTURE_DRIVER) + static GLuint -_cogl_texture_driver_gen (CoglContext *ctx, - GLenum gl_target, - CoglPixelFormat internal_format) +cogl_texture_driver_gl3_gen (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + CoglPixelFormat internal_format) { GLuint tex; @@ -149,10 +160,11 @@ prep_gl_for_pixels_download_full (CoglContext *ctx, } static void -_cogl_texture_driver_prep_gl_for_pixels_download (CoglContext *ctx, - int image_width, - int pixels_rowstride, - int pixels_bpp) +cogl_texture_driver_gl3_prep_gl_for_pixels_download (CoglTextureDriver *driver, + CoglContext *ctx, + int image_width, + int pixels_rowstride, + int pixels_bpp) { prep_gl_for_pixels_download_full (ctx, pixels_rowstride, @@ -163,19 +175,20 @@ _cogl_texture_driver_prep_gl_for_pixels_download (CoglContext *ctx, } static gboolean -_cogl_texture_driver_upload_subregion_to_gl (CoglContext *ctx, - CoglTexture *texture, - int src_x, - int src_y, - int dst_x, - int dst_y, - int width, - int height, - int level, - CoglBitmap *source_bmp, - GLuint source_gl_format, - GLuint source_gl_type, - GError **error) +cogl_texture_driver_gl3_upload_subregion_to_gl (CoglTextureDriver *driver, + CoglContext *ctx, + CoglTexture *texture, + int src_x, + int src_y, + int dst_x, + int dst_y, + int width, + int height, + int level, + CoglBitmap *source_bmp, + GLuint source_gl_format, + GLuint source_gl_type, + GError **error) { GLenum gl_target; GLuint gl_handle; @@ -280,14 +293,15 @@ _cogl_texture_driver_upload_subregion_to_gl (CoglContext *ctx, } static gboolean -_cogl_texture_driver_upload_to_gl (CoglContext *ctx, - GLenum gl_target, - GLuint gl_handle, - CoglBitmap *source_bmp, - GLint internal_gl_format, - GLuint source_gl_format, - GLuint source_gl_type, - GError **error) +cogl_texture_driver_gl3_upload_to_gl (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + GLuint gl_handle, + CoglBitmap *source_bmp, + GLint internal_gl_format, + GLuint source_gl_format, + GLuint source_gl_type, + GError **error) { uint8_t *data; CoglPixelFormat source_format = cogl_bitmap_get_format (source_bmp); @@ -343,11 +357,12 @@ _cogl_texture_driver_upload_to_gl (CoglContext *ctx, } static gboolean -_cogl_texture_driver_gl_get_tex_image (CoglContext *ctx, - GLenum gl_target, - GLenum dest_gl_format, - GLenum dest_gl_type, - uint8_t *dest) +cogl_texture_driver_gl3_gl_get_tex_image (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + GLenum dest_gl_format, + GLenum dest_gl_type, + uint8_t *dest) { GE (ctx, glGetTexImage (gl_target, 0, /* level */ @@ -358,13 +373,14 @@ _cogl_texture_driver_gl_get_tex_image (CoglContext *ctx, } static gboolean -_cogl_texture_driver_size_supported (CoglContext *ctx, - GLenum gl_target, - GLenum gl_intformat, - GLenum gl_format, - GLenum gl_type, - int width, - int height) +cogl_texture_driver_gl3_size_supported (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + GLenum gl_intformat, + GLenum gl_format, + GLenum gl_type, + int width, + int height) { GLenum proxy_target; GLint new_width = 0; @@ -389,8 +405,9 @@ _cogl_texture_driver_size_supported (CoglContext *ctx, } static gboolean -_cogl_texture_driver_upload_supported (CoglContext *ctx, - CoglPixelFormat format) +cogl_texture_driver_gl3_upload_supported (CoglTextureDriver *driver, + CoglContext *ctx, + CoglPixelFormat format) { switch (format) { @@ -458,11 +475,11 @@ _cogl_texture_driver_upload_supported (CoglContext *ctx, } static CoglPixelFormat -_cogl_texture_driver_find_best_gl_get_data_format - (CoglContext *context, - CoglPixelFormat format, - GLenum *closest_gl_format, - GLenum *closest_gl_type) +cogl_texture_driver_gl3_find_best_gl_get_data_format (CoglTextureDriver *driver, + CoglContext *context, + CoglPixelFormat format, + GLenum *closest_gl_format, + GLenum *closest_gl_type) { return context->driver_vtable->pixel_format_to_gl (context, format, @@ -471,15 +488,22 @@ _cogl_texture_driver_find_best_gl_get_data_format closest_gl_type); } -const CoglTextureDriver -_cogl_texture_driver_gl = - { - _cogl_texture_driver_gen, - _cogl_texture_driver_upload_subregion_to_gl, - _cogl_texture_driver_upload_to_gl, - _cogl_texture_driver_prep_gl_for_pixels_download, - _cogl_texture_driver_gl_get_tex_image, - _cogl_texture_driver_size_supported, - _cogl_texture_driver_upload_supported, - _cogl_texture_driver_find_best_gl_get_data_format - }; +static void +cogl_texture_driver_gl3_class_init (CoglTextureDriverGL3Class *klass) +{ + CoglTextureDriverClass *driver_klass = COGL_TEXTURE_DRIVER_CLASS (klass); + + driver_klass->gen = cogl_texture_driver_gl3_gen; + driver_klass->upload_subregion_to_gl = cogl_texture_driver_gl3_upload_subregion_to_gl; + driver_klass->upload_to_gl = cogl_texture_driver_gl3_upload_to_gl; + driver_klass->prep_gl_for_pixels_download = cogl_texture_driver_gl3_prep_gl_for_pixels_download; + driver_klass->gl_get_tex_image = cogl_texture_driver_gl3_gl_get_tex_image; + driver_klass->size_supported = cogl_texture_driver_gl3_size_supported; + driver_klass->format_supports_upload = cogl_texture_driver_gl3_upload_supported; + driver_klass->find_best_gl_get_data_format = cogl_texture_driver_gl3_find_best_gl_get_data_format; +} + +static void +cogl_texture_driver_gl3_init (CoglTextureDriverGL3 *driver) +{ +} diff --git a/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles2-private.h b/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles2-private.h new file mode 100644 index 000000000..1545aaef6 --- /dev/null +++ b/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles2-private.h @@ -0,0 +1,40 @@ +/* + * Cogl + * + * A Low Level GPU Graphics and Utilities API + * + * Copyright (C) 2024 Red Hat. + * + * 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, sublicense, 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 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 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * 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. + */ + +#pragma once + +#include "cogl/cogl-texture-driver.h" + + +G_DECLARE_FINAL_TYPE (CoglTextureDriverGLES2, + cogl_texture_driver_gles2, + COGL, + TEXTURE_DRIVER_GLES2, + CoglTextureDriver) + +#define COGL_TYPE_TEXTURE_DRIVER_GLES2 (cogl_texture_driver_gles2_get_type ()) diff --git a/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles.c b/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles2.c similarity index 75% rename from cogl/cogl/driver/gl/gles/cogl-texture-driver-gles.c rename to cogl/cogl/driver/gl/gles/cogl-texture-driver-gles2.c index 8d38d62a2..88260f7a8 100644 --- a/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles.c +++ b/cogl/cogl/driver/gl/gles/cogl-texture-driver-gles2.c @@ -42,6 +42,7 @@ #include "cogl/cogl-texture-private.h" #include "cogl/cogl-pipeline.h" #include "cogl/cogl-context-private.h" +#include "cogl/driver/gl/gles/cogl-texture-driver-gles2-private.h" #include "cogl/driver/gl/cogl-pipeline-opengl-private.h" #include "cogl/driver/gl/cogl-util-gl-private.h" #include "cogl/driver/gl/cogl-texture-gl-private.h" @@ -70,10 +71,21 @@ #define GL_UNPACK_SKIP_PIXELS 0x0CF4 #endif + +struct _CoglTextureDriverGLES2 +{ + CoglTextureDriver parent_instance; +}; + +G_DEFINE_FINAL_TYPE (CoglTextureDriverGLES2, + cogl_texture_driver_gles2, + COGL_TYPE_TEXTURE_DRIVER) + static GLuint -_cogl_texture_driver_gen (CoglContext *ctx, - GLenum gl_target, - CoglPixelFormat internal_format) +cogl_texture_driver_gles2_gen (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + CoglPixelFormat internal_format) { GLuint tex; @@ -134,10 +146,11 @@ _cogl_texture_driver_prep_gl_for_pixels_upload (CoglContext *ctx, } static void -_cogl_texture_driver_prep_gl_for_pixels_download (CoglContext *ctx, - int pixels_rowstride, - int image_width, - int pixels_bpp) +cogl_texture_driver_gles2_prep_gl_for_pixels_download (CoglTextureDriver *driver, + CoglContext *ctx, + int pixels_rowstride, + int image_width, + int pixels_bpp) { _cogl_texture_gl_prep_alignment_for_pixels_download (ctx, pixels_bpp, @@ -180,19 +193,20 @@ prepare_bitmap_alignment_for_upload (CoglContext *ctx, } static gboolean -_cogl_texture_driver_upload_subregion_to_gl (CoglContext *ctx, - CoglTexture *texture, - int src_x, - int src_y, - int dst_x, - int dst_y, - int width, - int height, - int level, - CoglBitmap *source_bmp, - GLuint source_gl_format, - GLuint source_gl_type, - GError **error) +cogl_texture_driver_gles2_upload_subregion_to_gl (CoglTextureDriver *driver, + CoglContext *ctx, + CoglTexture *texture, + int src_x, + int src_y, + int dst_x, + int dst_y, + int width, + int height, + int level, + CoglBitmap *source_bmp, + GLuint source_gl_format, + GLuint source_gl_type, + GError **error) { GLenum gl_target; GLuint gl_handle; @@ -335,14 +349,15 @@ _cogl_texture_driver_upload_subregion_to_gl (CoglContext *ctx, } static gboolean -_cogl_texture_driver_upload_to_gl (CoglContext *ctx, - GLenum gl_target, - GLuint gl_handle, - CoglBitmap *source_bmp, - GLint internal_gl_format, - GLuint source_gl_format, - GLuint source_gl_type, - GError **error) +cogl_texture_driver_gles2_upload_to_gl (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + GLuint gl_handle, + CoglBitmap *source_bmp, + GLint internal_gl_format, + GLuint source_gl_format, + GLuint source_gl_type, + GError **error) { CoglPixelFormat source_format = cogl_bitmap_get_format (source_bmp); int bpp; @@ -411,23 +426,25 @@ _cogl_texture_driver_upload_to_gl (CoglContext *ctx, * fallback to a generic render + readpixels approach to downloading * texture data. (See _cogl_texture_draw_and_read() ) */ static gboolean -_cogl_texture_driver_gl_get_tex_image (CoglContext *ctx, - GLenum gl_target, - GLenum dest_gl_format, - GLenum dest_gl_type, - uint8_t *dest) +cogl_texture_driver_gles2_gl_get_tex_image (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + GLenum dest_gl_format, + GLenum dest_gl_type, + uint8_t *dest) { return FALSE; } static gboolean -_cogl_texture_driver_size_supported (CoglContext *ctx, - GLenum gl_target, - GLenum gl_intformat, - GLenum gl_format, - GLenum gl_type, - int width, - int height) +cogl_texture_driver_gles2_size_supported (CoglTextureDriver *driver, + CoglContext *ctx, + GLenum gl_target, + GLenum gl_intformat, + GLenum gl_format, + GLenum gl_type, + int width, + int height) { GLint max_size; @@ -439,8 +456,9 @@ _cogl_texture_driver_size_supported (CoglContext *ctx, } static gboolean -_cogl_texture_driver_upload_supported (CoglContext *ctx, - CoglPixelFormat format) +cogl_texture_driver_gles2_upload_supported (CoglTextureDriver *driver, + CoglContext *ctx, + CoglPixelFormat format) { switch (format) { @@ -527,11 +545,11 @@ _cogl_texture_driver_upload_supported (CoglContext *ctx, } static CoglPixelFormat -_cogl_texture_driver_find_best_gl_get_data_format - (CoglContext *context, - CoglPixelFormat format, - GLenum *closest_gl_format, - GLenum *closest_gl_type) +cogl_texture_driver_gles2_find_best_gl_get_data_format (CoglTextureDriver *driver, + CoglContext *context, + CoglPixelFormat format, + GLenum *closest_gl_format, + GLenum *closest_gl_type) { /* Find closest format that's supported by GL (Can't use _cogl_pixel_format_to_gl since available formats @@ -541,15 +559,22 @@ _cogl_texture_driver_find_best_gl_get_data_format return COGL_PIXEL_FORMAT_RGBA_8888; } -const CoglTextureDriver -_cogl_texture_driver_gles = - { - _cogl_texture_driver_gen, - _cogl_texture_driver_upload_subregion_to_gl, - _cogl_texture_driver_upload_to_gl, - _cogl_texture_driver_prep_gl_for_pixels_download, - _cogl_texture_driver_gl_get_tex_image, - _cogl_texture_driver_size_supported, - _cogl_texture_driver_upload_supported, - _cogl_texture_driver_find_best_gl_get_data_format - }; +static void +cogl_texture_driver_gles2_class_init (CoglTextureDriverGLES2Class *klass) +{ + CoglTextureDriverClass *driver_klass = COGL_TEXTURE_DRIVER_CLASS (klass); + + driver_klass->gen = cogl_texture_driver_gles2_gen; + driver_klass->upload_subregion_to_gl = cogl_texture_driver_gles2_upload_subregion_to_gl; + driver_klass->upload_to_gl = cogl_texture_driver_gles2_upload_to_gl; + driver_klass->prep_gl_for_pixels_download = cogl_texture_driver_gles2_prep_gl_for_pixels_download; + driver_klass->gl_get_tex_image = cogl_texture_driver_gles2_gl_get_tex_image; + driver_klass->size_supported = cogl_texture_driver_gles2_size_supported; + driver_klass->format_supports_upload = cogl_texture_driver_gles2_upload_supported; + driver_klass->find_best_gl_get_data_format = cogl_texture_driver_gles2_find_best_gl_get_data_format; +} + +static void +cogl_texture_driver_gles2_init (CoglTextureDriverGLES2 *driver) +{ +} diff --git a/cogl/cogl/meson.build b/cogl/cogl/meson.build index 6c7b4b11c..237677744 100644 --- a/cogl/cogl/meson.build +++ b/cogl/cogl/meson.build @@ -109,12 +109,14 @@ cogl_common_driver_sources = [ gl_driver_sources = [ 'driver/gl/gl/cogl-driver-gl.c', - 'driver/gl/gl/cogl-texture-driver-gl.c', + 'driver/gl/gl/cogl-texture-driver-gl3.c', + 'driver/gl/gl/cogl-texture-driver-gl3-private.h', ] gles_driver_sources = [ 'driver/gl/gles/cogl-driver-gles.c', - 'driver/gl/gles/cogl-texture-driver-gles.c', + 'driver/gl/gles/cogl-texture-driver-gles2.c', + 'driver/gl/gles/cogl-texture-driver-gles2-private.h', ] cogl_driver_sources = [ @@ -255,6 +257,7 @@ cogl_sources = [ 'cogl-texture-2d-sliced-private.h', 'cogl-texture-2d-sliced.c', 'cogl-texture-2d.c', + 'cogl-texture-driver.c', 'cogl-texture-driver.h', 'cogl-texture-private.h', 'cogl-texture.c',