diff --git a/cogl/cogl/cogl-bitmap-conversion.c b/cogl/cogl/cogl-bitmap-conversion.c index 447db00b3..ab8251fc5 100644 --- a/cogl/cogl/cogl-bitmap-conversion.c +++ b/cogl/cogl/cogl-bitmap-conversion.c @@ -351,6 +351,14 @@ _cogl_bitmap_needs_short_temp_buffer (CoglPixelFormat format) case COGL_PIXEL_FORMAT_BGRA_1010102_PRE: case COGL_PIXEL_FORMAT_ARGB_2101010_PRE: case COGL_PIXEL_FORMAT_ABGR_2101010_PRE: + case COGL_PIXEL_FORMAT_RGBA_FP_16161616: + case COGL_PIXEL_FORMAT_BGRA_FP_16161616: + case COGL_PIXEL_FORMAT_ARGB_FP_16161616: + case COGL_PIXEL_FORMAT_ABGR_FP_16161616: + case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE: return TRUE; } diff --git a/cogl/cogl/cogl-bitmap-packing.h b/cogl/cogl/cogl-bitmap-packing.h index ac55d2e54..f668b0bea 100644 --- a/cogl/cogl/cogl-bitmap-packing.h +++ b/cogl/cogl/cogl-bitmap-packing.h @@ -323,6 +323,14 @@ G_PASTE (_cogl_unpack_abgr_2101010_, component_size) (const uint8_t *src, } } +inline static void +G_PASTE (_cogl_unpack_argb_fp_16161616_, component_size) (const uint8_t *src, + component_type *dst, + int width) +{ + g_warning ("Not implemented"); +} + #undef UNPACK_1 #undef UNPACK_2 #undef UNPACK_4 @@ -396,6 +404,16 @@ G_PASTE (_cogl_unpack_, component_size) (CoglPixelFormat format, case COGL_PIXEL_FORMAT_ABGR_2101010_PRE: G_PASTE (_cogl_unpack_abgr_2101010_, component_size) (src, dst, width); break; + case COGL_PIXEL_FORMAT_RGBA_FP_16161616: + case COGL_PIXEL_FORMAT_BGRA_FP_16161616: + case COGL_PIXEL_FORMAT_ARGB_FP_16161616: + case COGL_PIXEL_FORMAT_ABGR_FP_16161616: + case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE: + G_PASTE (_cogl_unpack_argb_fp_16161616_, component_size) (src, dst, width); + break; case COGL_PIXEL_FORMAT_DEPTH_16: case COGL_PIXEL_FORMAT_DEPTH_32: case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8: @@ -683,6 +701,14 @@ G_PASTE (_cogl_pack_abgr_2101010_, component_size) (const component_type *src, } } +inline static void +G_PASTE (_cogl_pack_argb_fp_16161616_, component_size) (const component_type *src, + uint8_t *dst, + int width) +{ + g_warning ("Not implemented"); +} + #undef PACK_SIZE #undef PACK_1 #undef PACK_2 @@ -757,6 +783,16 @@ G_PASTE (_cogl_pack_, component_size) (CoglPixelFormat format, case COGL_PIXEL_FORMAT_ABGR_2101010_PRE: G_PASTE (_cogl_pack_abgr_2101010_, component_size) (src, dst, width); break; + case COGL_PIXEL_FORMAT_RGBA_FP_16161616: + case COGL_PIXEL_FORMAT_BGRA_FP_16161616: + case COGL_PIXEL_FORMAT_ARGB_FP_16161616: + case COGL_PIXEL_FORMAT_ABGR_FP_16161616: + case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE: + G_PASTE (_cogl_pack_argb_fp_16161616_, component_size) (src, dst, width); + break; case COGL_PIXEL_FORMAT_DEPTH_16: case COGL_PIXEL_FORMAT_DEPTH_32: case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8: diff --git a/cogl/cogl/cogl-pixel-format.c b/cogl/cogl/cogl-pixel-format.c index bfe6e13ad..11df72bf0 100644 --- a/cogl/cogl/cogl-pixel-format.c +++ b/cogl/cogl/cogl-pixel-format.c @@ -245,6 +245,62 @@ static const CoglPixelFormatInfo format_info_table[] = { .aligned = 0, .bpp = { 4 }, }, + { + .cogl_format = COGL_PIXEL_FORMAT_RGBA_FP_16161616, + .format_str = "RGBA_FP_16161616", + .n_planes = 1, + .bpp = { 8 }, + .aligned = 1 + }, + { + .cogl_format = COGL_PIXEL_FORMAT_BGRA_FP_16161616, + .format_str = "BGRA_FP_16161616", + .n_planes = 1, + .bpp = { 8 }, + .aligned = 1 + }, + { + .cogl_format = COGL_PIXEL_FORMAT_ARGB_FP_16161616, + .format_str = "ARGB_FP_16161616", + .n_planes = 1, + .bpp = { 8 }, + .aligned = 1 + }, + { + .cogl_format = COGL_PIXEL_FORMAT_ABGR_FP_16161616, + .format_str = "ABGR_FP_16161616", + .n_planes = 1, + .bpp = { 8 }, + .aligned = 1 + }, + { + .cogl_format = COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE, + .format_str = "RGBA_FP_16161616_PRE", + .n_planes = 1, + .bpp = { 8 }, + .aligned = 1 + }, + { + .cogl_format = COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE, + .format_str = "BGRA_FP_16161616_PRE", + .n_planes = 1, + .bpp = { 8 }, + .aligned = 1 + }, + { + .cogl_format = COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE, + .format_str = "ARGB_FP_16161616_PRE", + .n_planes = 1, + .bpp = { 8 }, + .aligned = 1 + }, + { + .cogl_format = COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE, + .format_str = "ABGR_FP_16161616_PRE", + .n_planes = 1, + .bpp = { 8 }, + .aligned = 1 + }, { .cogl_format = COGL_PIXEL_FORMAT_DEPTH_16, .format_str = "DEPTH_16", diff --git a/cogl/cogl/cogl-pixel-format.h b/cogl/cogl/cogl-pixel-format.h index e2f898c97..7ef03d3fd 100644 --- a/cogl/cogl/cogl-pixel-format.h +++ b/cogl/cogl/cogl-pixel-format.h @@ -103,7 +103,7 @@ G_BEGIN_DECLS * 7 = YUV: undefined bpp, undefined alignment * 9 = 2 bpp, aligned * 10 = depth, aligned (8, 16, 24, 32, 32f) - * 11 = undefined + * 11 = 8 bpp fp16 * 12 = 3 bpp, not aligned * 13 = 4 bpp, not aligned (e.g. 2101010) * 14-15 = undefined @@ -168,6 +168,14 @@ G_BEGIN_DECLS * @COGL_PIXEL_FORMAT_BGRA_1010102_PRE: Premultiplied BGRA, 32 bits, 10 bpc * @COGL_PIXEL_FORMAT_ARGB_2101010_PRE: Premultiplied ARGB, 32 bits, 10 bpc * @COGL_PIXEL_FORMAT_ABGR_2101010_PRE: Premultiplied ABGR, 32 bits, 10 bpc + * @COGL_PIXEL_FORMAT_RGBA_FP_16161616: RGBA half floating point, 64 bit + * @COGL_PIXEL_FORMAT_BGRA_FP_16161616: BGRA half floating point, 64 bit + * @COGL_PIXEL_FORMAT_ARGB_FP_16161616: ARGB half floating point, 64 bit + * @COGL_PIXEL_FORMAT_ABGR_FP_16161616: ABGR half floating point, 64 bit + * @COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: Premultiplied RGBA half floating point, 64 bit + * @COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE: Premultiplied BGRA half floating point, 64 bit + * @COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE: Premultiplied ARGB half floating point, 64 bit + * @COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE: Premultiplied ABGR half floating point, 64 bit * * Pixel formats used by Cogl. For the formats with a byte per * component, the order of the components specify the order in @@ -216,6 +224,11 @@ typedef enum /*< prefix=COGL_PIXEL_FORMAT >*/ COGL_PIXEL_FORMAT_ARGB_2101010 = (13 | COGL_A_BIT | COGL_AFIRST_BIT), COGL_PIXEL_FORMAT_ABGR_2101010 = (13 | COGL_A_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT), + COGL_PIXEL_FORMAT_RGBA_FP_16161616 = (11 | COGL_A_BIT), + COGL_PIXEL_FORMAT_BGRA_FP_16161616 = (11 | COGL_A_BIT | COGL_BGR_BIT), + COGL_PIXEL_FORMAT_ARGB_FP_16161616 = (11 | COGL_A_BIT | COGL_AFIRST_BIT), + COGL_PIXEL_FORMAT_ABGR_FP_16161616 = (11 | COGL_A_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT), + COGL_PIXEL_FORMAT_RGBA_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT), COGL_PIXEL_FORMAT_BGRA_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT), COGL_PIXEL_FORMAT_ARGB_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_AFIRST_BIT), @@ -228,6 +241,11 @@ typedef enum /*< prefix=COGL_PIXEL_FORMAT >*/ COGL_PIXEL_FORMAT_ARGB_2101010_PRE = (COGL_PIXEL_FORMAT_ARGB_2101010 | COGL_PREMULT_BIT), COGL_PIXEL_FORMAT_ABGR_2101010_PRE = (COGL_PIXEL_FORMAT_ABGR_2101010 | COGL_PREMULT_BIT), + COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT), + COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT), + COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_AFIRST_BIT), + COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT), + COGL_PIXEL_FORMAT_DEPTH_16 = (9 | COGL_DEPTH_BIT), COGL_PIXEL_FORMAT_DEPTH_32 = (3 | COGL_DEPTH_BIT), diff --git a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c index 320005355..35e9897f7 100644 --- a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c +++ b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c @@ -288,6 +288,31 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context, gltype = GL_UNSIGNED_SHORT_5_5_5_1; break; + case COGL_PIXEL_FORMAT_RGBA_FP_16161616: + case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: + glintformat = GL_RGBA; + glformat = GL_RGBA; + gltype = GL_HALF_FLOAT; + break; + case COGL_PIXEL_FORMAT_BGRA_FP_16161616: + case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE: + glintformat = GL_RGBA; + glformat = GL_BGRA; + gltype = GL_HALF_FLOAT; + break; + case COGL_PIXEL_FORMAT_ARGB_FP_16161616: + case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE: + glintformat = GL_RGBA; + glformat = GL_BGRA; + gltype = GL_HALF_FLOAT; + break; + case COGL_PIXEL_FORMAT_ABGR_FP_16161616: + case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE: + glintformat = GL_RGBA; + glformat = GL_RGBA; + gltype = GL_HALF_FLOAT; + break; + case COGL_PIXEL_FORMAT_DEPTH_16: glintformat = GL_DEPTH_COMPONENT16; glformat = GL_DEPTH_COMPONENT; diff --git a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c index e41c7fdd2..2d02589a4 100644 --- a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c +++ b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c @@ -59,6 +59,9 @@ #ifndef GL_UNSIGNED_INT_2_10_10_10_REV_EXT #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 #endif +#ifndef GL_HALF_FLOAT_OES +#define GL_HALF_FLOAT_OES 0x8D61 +#endif static gboolean _cogl_driver_pixel_format_from_gl_internal (CoglContext *context, @@ -207,6 +210,26 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context, gltype = GL_UNSIGNED_SHORT_5_5_5_1; break; + case COGL_PIXEL_FORMAT_BGRA_FP_16161616: + case COGL_PIXEL_FORMAT_ARGB_FP_16161616: + case COGL_PIXEL_FORMAT_ABGR_FP_16161616: + case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE: + case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE: + g_warning ("Unhandled 16 bpc pixel format used"); + + G_GNUC_FALLTHROUGH; + case COGL_PIXEL_FORMAT_RGBA_FP_16161616: + case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: + if (!_cogl_has_private_feature + (context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT)) + g_warning ("Missing 16 bpc half float extension"); + + glintformat = GL_RGBA; + glformat = GL_RGBA; + gltype = GL_HALF_FLOAT_OES; + break; + case COGL_PIXEL_FORMAT_DEPTH_16: glintformat = GL_DEPTH_COMPONENT; glformat = GL_DEPTH_COMPONENT;