The IMG patch Eric was referring to was to dEQP. I submitted bug reports to Google and Khronos:

https://issuetracker.google.com/issues/64059452

https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/594

I've attached the patch to this email. The problem is that the dEQP *resize.surface_size* tests check the native window dimensions after creating the window, without having called eglSwapBuffers, and hence get back a width and height of zero, resulting in the tests failing.

Here is the patch description:

The Wayland version of deqp-egl calls wl_egl_window_get_attached_size
to get window dimensions. On Mesa at least, this initially returns a
width and height of zero for a new window. The surface resize tests
check the initial surface size, and fail as a result.

Add a new native window capability, CAPABILITY_INITIAL_SURFACE_SIZE_QUERY,
which is only set if the initial window size can be queried after
creation. If native windows don't have the capability, return the
required size from getNativeSurfaceSize, rather than the size obtained
from the window system.

A parameter has been added to getNativeSurfaceSize, to indicate if
the initial size of a surface is being queried.

Brendan.

On 01/06/18 09:12, Juan A. Suarez Romero wrote:
On Thu, 2018-05-31 at 16:57 +0100, Daniel Stone wrote:
Hi Juan,
Thanks for picking this up!

On 31 May 2018 at 16:44, Juan A. Suarez Romero <jasua...@igalia.com> wrote:
@@ -255,6 +257,12 @@ dri2_wl_create_window_surface(_EGLDriver *drv, _EGLDisplay 
*disp,
        goto cleanup_surf;
     }

+   dri2_surf->base.Width = window->width;
+   dri2_surf->base.Height = window->height;
+
+   window->attached_width = dri2_surf->base.Width;
+   window->attached_height = dri2_surf->base.Height;
We should definitely not initialise attached_{width,height} here,
because no buffer has ever been attached.

@@ -574,8 +582,8 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
     struct dri2_egl_display *dri2_dpy =
        dri2_egl_display(dri2_surf->base.Resource.Display);

-   if (dri2_surf->base.Width != dri2_surf->wl_win->width ||
-       dri2_surf->base.Height != dri2_surf->wl_win->height) {
+   if (dri2_surf->wl_win->attached_width != dri2_surf->wl_win->width ||
+       dri2_surf->wl_win->attached_height != dri2_surf->wl_win->height) {

        dri2_wl_release_buffers(dri2_surf);

@@ -1629,8 +1637,8 @@ swrast_update_buffers(struct dri2_egl_surface *dri2_surf)
     if (dri2_surf->back)
        return 0;

-   if (dri2_surf->base.Width != dri2_surf->wl_win->width ||
-       dri2_surf->base.Height != dri2_surf->wl_win->height) {
+   if (dri2_surf->wl_win->attached_width != dri2_surf->wl_win->width ||
+       dri2_surf->wl_win->attached_height != dri2_surf->wl_win->height) {
Not initialising attached_{width,height} should not cause any problems
with these checks. By definition there cannot have been any buffers
allocated or attached between creation and the first draw call, so
there are no old buffers to release.
Eric explained pretty well the reason to touch attached_{width,height};
otherwise dEQP-EGL.functional.resize.surface_size.* tests continue to fail.


        J.A.


So with that initialisation removed, this is (assuming dEQP still passes):
Reviewed-by: Daniel Stone <dani...@collabora.com>

Cheers,
Daniel

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

>From 0e82ac55c7bba15b2f17eda74e492c0d6040e7e0 Mon Sep 17 00:00:00 2001
From: Brendan King <brendan.k...@imgtec.com>
Date: Tue, 25 Jul 2017 16:01:22 +0100
Subject: [PATCH] Fix the deqp-egl *resize.surface_size* for Wayland

The Wayland version of deqp-egl calls wl_egl_window_get_attached_size
to get window dimensions. On Mesa at least, this initially returns a
width and height of zero for a new window. The surface resize tests
check the initial surface size, and fail as a result.

Add a new native window capability, CAPABILITY_INITIAL_SURFACE_SIZE_QUERY,
which is only set if the initial window size can be queried after
creation. If native windows don't have the capability, return the
required size from getNativeSurfaceSize, rather than the size obtained
from the window system.

A parameter has been added to getNativeSurfaceSize, to indicate if
the initial size of a surface is being queried.
---
 framework/egl/egluNativeWindow.hpp                           | 3 ++-
 framework/platform/X11/tcuX11EglPlatform.cpp                 | 3 ++-
 framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp | 3 ++-
 modules/egl/teglResizeTests.cpp                              | 9 ++++++---
 4 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/framework/egl/egluNativeWindow.hpp b/framework/egl/egluNativeWindow.hpp
index e468a23..1a4054d 100644
--- a/framework/egl/egluNativeWindow.hpp
+++ b/framework/egl/egluNativeWindow.hpp
@@ -81,7 +81,8 @@ public:
 		CAPABILITY_SET_SURFACE_SIZE			= (1<<3),
 		CAPABILITY_GET_SCREEN_SIZE			= (1<<4),
 		CAPABILITY_READ_SCREEN_PIXELS		= (1<<5),
-		CAPABILITY_CHANGE_VISIBILITY		= (1<<6)
+		CAPABILITY_CHANGE_VISIBILITY		= (1<<6),
+		CAPABILITY_INITIAL_SURFACE_SIZE_QUERY	= (1<<7)
 	};
 
 	virtual								~NativeWindow					(void) {}
diff --git a/framework/platform/X11/tcuX11EglPlatform.cpp b/framework/platform/X11/tcuX11EglPlatform.cpp
index ca90bc3..d0bbef3 100644
--- a/framework/platform/X11/tcuX11EglPlatform.cpp
+++ b/framework/platform/X11/tcuX11EglPlatform.cpp
@@ -127,7 +127,8 @@ public:
 															 CAPABILITY_CREATE_SURFACE_PLATFORM |
 															 CAPABILITY_GET_SURFACE_SIZE |
 															 CAPABILITY_SET_SURFACE_SIZE |
-															 CAPABILITY_GET_SCREEN_SIZE);
+															 CAPABILITY_GET_SCREEN_SIZE  |
+															 CAPABILITY_INITIAL_SURFACE_SIZE_QUERY);
 
 								Window				(Display&				display,
 													 const WindowParams&	params,
diff --git a/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp b/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp
index 9c55196..2678a50 100644
--- a/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp
+++ b/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp
@@ -62,7 +62,8 @@ static const eglu::NativeWindow::Capability		WINDOW_CAPABILITIES		= (eglu::Nativ
 																		    eglu::NativeWindow::CAPABILITY_GET_SCREEN_SIZE			|
 																			eglu::NativeWindow::CAPABILITY_READ_SCREEN_PIXELS		|
 																		    eglu::NativeWindow::CAPABILITY_SET_SURFACE_SIZE			|
-																			eglu::NativeWindow::CAPABILITY_CHANGE_VISIBILITY);
+																			eglu::NativeWindow::CAPABILITY_CHANGE_VISIBILITY		|
+																			eglu::NativeWindow::CAPABILITY_INITIAL_SURFACE_SIZE_QUERY);
 
 class NativeDisplay : public eglu::NativeDisplay
 {
diff --git a/modules/egl/teglResizeTests.cpp b/modules/egl/teglResizeTests.cpp
index 60cc66d..4b41b8e 100644
--- a/modules/egl/teglResizeTests.cpp
+++ b/modules/egl/teglResizeTests.cpp
@@ -318,9 +318,10 @@ inline bool hasBits (T bitSet, T requiredBits)
 }
 
 IVec2 getNativeSurfaceSize (const NativeWindow& nativeWindow,
+							bool				getInitialSize,
 							IVec2				reqSize)
 {
-	if (hasBits(nativeWindow.getCapabilities(), NativeWindow::CAPABILITY_GET_SURFACE_SIZE))
+	if (hasBits(nativeWindow.getCapabilities(), getInitialSize ? NativeWindow::CAPABILITY_INITIAL_SURFACE_SIZE_QUERY : NativeWindow::CAPABILITY_GET_SURFACE_SIZE))
 		return nativeWindow.getSurfaceSize();
 	return reqSize; // assume we got the requested size
 }
@@ -329,10 +330,11 @@ IVec2 checkSurfaceSize (const Library&		egl,
 						EGLDisplay			eglDisplay,
 						EGLSurface			eglSurface,
 						const NativeWindow&	nativeWindow,
+						bool				getInitialSize,
 						IVec2				reqSize,
 						ResultCollector&	status)
 {
-	const IVec2		nativeSize	= getNativeSurfaceSize(nativeWindow, reqSize);
+	const IVec2		nativeSize	= getNativeSurfaceSize(nativeWindow, getInitialSize, reqSize);
 	IVec2			eglSize		= eglu::getSurfaceSize(egl, eglDisplay, eglSurface);
 	ostringstream	oss;
 
@@ -351,6 +353,7 @@ IterateResult ChangeSurfaceSizeCase::iterate (void)
 														   m_display,
 														   **m_surface,
 														   *m_nativeWindow,
+														   true,
 														   m_oldSize,
 														   m_status);
 
@@ -360,7 +363,7 @@ IterateResult ChangeSurfaceSizeCase::iterate (void)
 
 	egl.swapBuffers(m_display, **m_surface);
 	EGLU_CHECK_MSG(egl, "eglSwapBuffers()");
-	checkSurfaceSize(egl, m_display, **m_surface, *m_nativeWindow, m_newSize, m_status);
+	checkSurfaceSize(egl, m_display, **m_surface, *m_nativeWindow, false, m_newSize, m_status);
 
 	m_status.setTestContextResult(m_testCtx);
 	return STOP;
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to