diff -Naur weston-11.0.1.orig/libweston/renderer-gl/gl-renderer.c weston-11.0.1/libweston/renderer-gl/gl-renderer.c
--- weston-11.0.1.orig/libweston/renderer-gl/gl-renderer.c	2022-12-14 12:39:30.000000000 +0530
+++ weston-11.0.1/libweston/renderer-gl/gl-renderer.c	2024-03-19 22:23:07.274176447 +0530
@@ -153,6 +153,8 @@
 	GLenum gl_pixel_type;
 	GLenum gl_format[3];
 	int offset[3]; /* per-plane pitch in bytes */
+	int hsub[3];  /* horizontal subsampling per plane */
+	int vsub[3];  /* vertical subsampling per plane */
 
 	EGLImageKHR images[3];
 	int num_images;
@@ -1793,6 +1795,7 @@
 {
 	const struct weston_testsuite_quirks *quirks =
 		&surface->compositor->test_data.test_quirks;
+	struct gl_renderer *gr = get_renderer(surface->compositor);
 	struct gl_surface_state *gs = get_surface_state(surface);
 	struct gl_buffer_state *gb = gs->buffer;
 	struct weston_view *view;
@@ -1830,6 +1833,24 @@
 	if (!pixman_region32_not_empty(&gb->texture_damage) &&
 	    !gb->needs_full_upload)
 		goto done;
+	
+	if (!gr->has_unpack_subimage) {
+		wl_shm_buffer_begin_access(buffer->shm_buffer);
+		for (j = 0; j < gb->num_textures; j++) {
+			glBindTexture(GL_TEXTURE_2D, gb->textures[j]);
+			glTexImage2D(GL_TEXTURE_2D, 0,
+				     gb->gl_format[j],
+				     gb->pitch / gb->hsub[j],
+				     buffer->height / gb->vsub[j],
+				     0,
+				     gl_format_from_internal(gb->gl_format[j]),
+				     gb->gl_pixel_type,
+				     data + gb->offset[j]);
+		}
+		wl_shm_buffer_end_access(buffer->shm_buffer);
+
+		goto done;
+	}	
 
 	data = wl_shm_buffer_get_data(buffer->shm_buffer);
 
@@ -3878,11 +3899,9 @@
 	else
 		ec->read_format = pixel_format_get_info_by_pixman(PIXMAN_a8b8g8r8);
 
-	if (gr->gl_version < gr_gl_version(3, 0) &&
-	    !weston_check_egl_extension(extensions, "GL_EXT_unpack_subimage")) {
-		weston_log("GL_EXT_unpack_subimage not available.\n");
-		return -1;
-	}
+	if (gr->gl_version < gr_gl_version(3, 0) ||
+	    weston_check_egl_extension(extensions, "GL_EXT_unpack_subimage"))
+		gr->has_unpack_subimage = true;
 
 	if (gr->gl_version >= gr_gl_version(3, 0) ||
 	    weston_check_egl_extension(extensions, "GL_EXT_texture_type_2_10_10_10_REV"))
diff -Naur weston-11.0.1.orig/libweston/renderer-gl/gl-renderer-internal.h weston-11.0.1/libweston/renderer-gl/gl-renderer-internal.h
--- weston-11.0.1.orig/libweston/renderer-gl/gl-renderer-internal.h	2022-12-14 12:39:30.000000000 +0530
+++ weston-11.0.1/libweston/renderer-gl/gl-renderer-internal.h	2024-03-19 22:12:57.651397797 +0530
@@ -147,6 +147,8 @@
 	PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display;
 	PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC create_platform_window;
 	bool has_platform_base;
+	
+	bool has_unpack_subimage;
 
 	PFNEGLBINDWAYLANDDISPLAYWL bind_display;
 	PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display;
