summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte.benjamin@googlemail.com>2021-10-09 11:59:42 +0000
committerBenjamin Otte <otte.benjamin@googlemail.com>2021-10-09 11:59:42 +0000
commit5311616ca15ecbca19cfa7b81ba20a44a151cb62 (patch)
tree50940fa35cdba90a14b9e71618b5a5f0a78349f3
parentdb167e09c5f8fa4f9b2bb93cc35db72387f2dbaa (diff)
parente581c148d9b304886387953d7ab7114711109cc7 (diff)
downloadgtk+-5311616ca15ecbca19cfa7b81ba20a44a151cb62.tar.gz
Merge branch 'wip/otte/gles' into 'master'
Improve GLES See merge request GNOME/gtk!4050
-rw-r--r--.gitlab-ci.yml1
-rwxr-xr-x.gitlab-ci/run-tests.sh24
-rw-r--r--gdk/gdkglcontext.c10
-rw-r--r--gdk/gdkmemoryformat.c2
-rw-r--r--gsk/ngl/gsknglcommandqueue.c4
-rw-r--r--testsuite/gdk/memorytexture.c22
-rw-r--r--testsuite/meson.build12
7 files changed, 68 insertions, 7 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 70949b9e18..212c857643 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -91,6 +91,7 @@ fedora-x86_64:
- meson compile -C _build_hello
- .gitlab-ci/run-tests.sh _build x11
- .gitlab-ci/run-tests.sh _build wayland
+ - .gitlab-ci/run-tests.sh _build waylandgles
- .gitlab-ci/run-tests.sh _build broadway
release-build:
diff --git a/.gitlab-ci/run-tests.sh b/.gitlab-ci/run-tests.sh
index fa29859b6f..e68cf5a6c9 100755
--- a/.gitlab-ci/run-tests.sh
+++ b/.gitlab-ci/run-tests.sh
@@ -44,6 +44,24 @@ case "${backend}" in
kill ${compositor}
;;
+ waylandgles)
+ export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)"
+
+ weston --backend=headless-backend.so --socket=wayland-6 --idle-time=0 &
+ compositor=$!
+ export WAYLAND_DISPLAY=wayland-6
+
+ meson test -C ${builddir} \
+ --timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
+ --print-errorlogs \
+ --setup=${backend} \
+ --suite=gtk \
+ --no-suite=gsk-compare-broadway
+
+ exit_code=$?
+ kill ${compositor}
+ ;;
+
broadway)
export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)"
@@ -62,6 +80,12 @@ case "${backend}" in
exit_code=0
kill ${server}
;;
+
+ *)
+ echo "Failed to add ${backend} to .gitlab-ci/run-tests.sh"
+ exit 1
+ ;;
+
esac
cd ${builddir}
diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c
index ecd9ed7615..f719da3aea 100644
--- a/gdk/gdkglcontext.c
+++ b/gdk/gdkglcontext.c
@@ -281,6 +281,7 @@ gdk_gl_context_upload_texture (GdkGLContext *context,
width, height);
data = copy;
data_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
+ stride = width * 4;
if (!gdk_memory_format_gl_format (data_format,
gdk_gl_context_get_use_es (context),
&gl_internalformat,
@@ -297,17 +298,17 @@ gdk_gl_context_upload_texture (GdkGLContext *context,
bpp = gdk_memory_format_bytes_per_pixel (data_format);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, gdk_memory_format_alignment (data_format));
+
/* GL_UNPACK_ROW_LENGTH is available on desktop GL, OpenGL ES >= 3.0, or if
* the GL_EXT_unpack_subimage extension for OpenGL ES 2.0 is available
*/
if (stride == width * bpp)
{
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-
glTexImage2D (texture_target, 0, gl_internalformat, width, height, 0, gl_format, gl_type, data);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
}
- else if ((!gdk_gl_context_get_use_es (context) ||
+ else if (stride % bpp == 0 &&
+ (!gdk_gl_context_get_use_es (context) ||
(priv->gl_version >= 30 || priv->has_unpack_subimage)))
{
glPixelStorei (GL_UNPACK_ROW_LENGTH, stride / bpp);
@@ -323,6 +324,7 @@ gdk_gl_context_upload_texture (GdkGLContext *context,
for (i = 0; i < height; i++)
glTexSubImage2D (texture_target, 0, 0, i, width, 1, gl_format, gl_type, data + (i * stride));
}
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
g_free (copy);
}
diff --git a/gdk/gdkmemoryformat.c b/gdk/gdkmemoryformat.c
index 5af2bb8516..5ee530654f 100644
--- a/gdk/gdkmemoryformat.c
+++ b/gdk/gdkmemoryformat.c
@@ -274,7 +274,7 @@ static const GdkMemoryFormatDescription memory_formats[GDK_MEMORY_N_FORMATS] = {
G_ALIGNOF (guchar),
FALSE,
TRUE,
- { GL_RGBA8, GL_RGB, GL_UNSIGNED_BYTE },
+ { GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE },
r8g8b8_to_float,
r8g8b8_from_float,
},
diff --git a/gsk/ngl/gsknglcommandqueue.c b/gsk/ngl/gsknglcommandqueue.c
index f7db75016d..a5d2a2245e 100644
--- a/gsk/ngl/gsknglcommandqueue.c
+++ b/gsk/ngl/gsknglcommandqueue.c
@@ -1305,10 +1305,10 @@ gsk_ngl_command_queue_create_texture (GskNglCommandQueue *self,
glTexImage2D (GL_TEXTURE_2D, 0, format, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
break;
case GL_RGBA16F:
- glTexImage2D (GL_TEXTURE_2D, 0, format, width, height, 0, GL_BGRA, GL_HALF_FLOAT, NULL);
+ glTexImage2D (GL_TEXTURE_2D, 0, format, width, height, 0, GL_RGBA, GL_HALF_FLOAT, NULL);
break;
case GL_RGBA32F:
- glTexImage2D (GL_TEXTURE_2D, 0, format, width, height, 0, GL_BGRA, GL_FLOAT, NULL);
+ glTexImage2D (GL_TEXTURE_2D, 0, format, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
break;
default:
/* If you add new formats, make sure to set the correct format and type here
diff --git a/testsuite/gdk/memorytexture.c b/testsuite/gdk/memorytexture.c
index 488aec4d6c..401ad58d2f 100644
--- a/testsuite/gdk/memorytexture.c
+++ b/testsuite/gdk/memorytexture.c
@@ -618,6 +618,27 @@ test_download_4x4 (gconstpointer data)
}
}
+/* larger than what NGL puts into the icon cache */
+static void
+test_download_192x192 (gconstpointer data)
+{
+ GdkMemoryFormat format;
+ TextureMethod method;
+ GdkTexture *expected, *test;
+ GdkRGBA color;
+
+ decode (data, &format, &method);
+
+ create_random_color (&color);
+ expected = create_texture (GDK_MEMORY_DEFAULT, TEXTURE_METHOD_LOCAL, 192, 192, &color);
+ test = create_texture (format, method, 192, 192, &color);
+
+ compare_textures (expected, test, gdk_memory_format_has_alpha (format));
+
+ g_object_unref (expected);
+ g_object_unref (test);
+}
+
static void
test_download_float_1x1 (gconstpointer data)
{
@@ -708,6 +729,7 @@ main (int argc, char *argv[])
add_test ("/memorytexture/download_1x1", test_download_1x1);
add_test ("/memorytexture/download_4x4", test_download_4x4);
+ add_test ("/memorytexture/download_192x192", test_download_192x192);
add_test ("/memorytexture/download_float_1x1", test_download_float_1x1);
add_test ("/memorytexture/download_float_4x4", test_download_float_4x4);
diff --git a/testsuite/meson.build b/testsuite/meson.build
index 0b75c90811..10fa16dfbc 100644
--- a/testsuite/meson.build
+++ b/testsuite/meson.build
@@ -30,6 +30,18 @@ if wayland_enabled
'TEST_OUTPUT_SUBDIR=wayland',
])
+ if get_option('debug')
+ gdk_debug = 'GDK_DEBUG=gl-gles,default-settings'
+ else
+ gdk_debug = 'GDK_DEBUG=gl-gles'
+ endif
+ add_test_setup ('waylandgles',
+ env: common_env + [
+ 'GDK_BACKEND=wayland',
+ 'TEST_OUTPUT_SUBDIR=waylandgles',
+ gdk_debug,
+ ])
+
endif
if os_win32