[PATCH v2 4/6] ui/console-gl: Add a helper to create a texture with linear memory layout

Vivek Kasireddy posted 6 patches 1 week ago
[PATCH v2 4/6] ui/console-gl: Add a helper to create a texture with linear memory layout
Posted by Vivek Kasireddy 1 week ago
There are cases where we do not want the memory layout of a texture to
be tiled as the component processing the texture would not know how to
de-tile either via software or hardware. Therefore, ensuring that the
memory backing the texture has a linear layout is absolutely necessary
in these situations.

Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Cc: Frediano Ziglio <freddy77@gmail.com>
Cc: Dongwon Kim <dongwon.kim@intel.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
---
 include/ui/console.h |  2 ++
 ui/console-gl.c      | 26 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/include/ui/console.h b/include/ui/console.h
index 46b3128185..fa2dd53e2e 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -422,6 +422,8 @@ bool console_gl_check_format(DisplayChangeListener *dcl,
                              pixman_format_code_t format);
 void surface_gl_create_texture(QemuGLShader *gls,
                                DisplaySurface *surface);
+void surface_gl_create_texture_from_fd(DisplaySurface *surface,
+                                       int fd, GLuint *texture);
 void surface_gl_update_texture(QemuGLShader *gls,
                                DisplaySurface *surface,
                                int x, int y, int w, int h);
diff --git a/ui/console-gl.c b/ui/console-gl.c
index 103b954017..8ee882bc3c 100644
--- a/ui/console-gl.c
+++ b/ui/console-gl.c
@@ -96,6 +96,32 @@ void surface_gl_create_texture(QemuGLShader *gls,
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 }
 
+void surface_gl_create_texture_from_fd(DisplaySurface *surface,
+                                       int fd, GLuint *texture)
+{
+    unsigned long size = surface_stride(surface) * surface_height(surface);
+    GLuint mem_obj;
+
+    if (!epoxy_has_gl_extension("GL_EXT_memory_object") ||
+        !epoxy_has_gl_extension("GL_EXT_memory_object_fd")) {
+        return;
+    }
+
+#ifdef GL_EXT_memory_object_fd
+    glCreateMemoryObjectsEXT(1, &mem_obj);
+    glImportMemoryFdEXT(mem_obj, size, GL_HANDLE_TYPE_OPAQUE_FD_EXT, fd);
+    if (!glIsMemoryObjectEXT(mem_obj)) {
+        return;
+    }
+
+    glGenTextures(1, texture);
+    glBindTexture(GL_TEXTURE_2D, *texture);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_TILING_EXT, GL_LINEAR_TILING_EXT);
+    glTexStorageMem2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, surface_width(surface),
+                         surface_height(surface), mem_obj, 0);
+#endif
+}
+
 void surface_gl_update_texture(QemuGLShader *gls,
                                DisplaySurface *surface,
                                int x, int y, int w, int h)
-- 
2.48.1


Re: [PATCH v2 4/6] ui/console-gl: Add a helper to create a texture with linear memory layout
Posted by Dmitry Osipenko 1 week ago
On 3/26/25 02:39, Vivek Kasireddy wrote:
> +void surface_gl_create_texture_from_fd(DisplaySurface *surface,
> +                                       int fd, GLuint *texture)
> +{
> +    unsigned long size = surface_stride(surface) * surface_height(surface);
> +    GLuint mem_obj;
> +
> +    if (!epoxy_has_gl_extension("GL_EXT_memory_object") ||
> +        !epoxy_has_gl_extension("GL_EXT_memory_object_fd")) {
> +        return;
> +    }
> +
> +#ifdef GL_EXT_memory_object_fd
> +    glCreateMemoryObjectsEXT(1, &mem_obj);
> +    glImportMemoryFdEXT(mem_obj, size, GL_HANDLE_TYPE_OPAQUE_FD_EXT, fd);
> +    if (!glIsMemoryObjectEXT(mem_obj)) {

This check should always succeed. glGetError() should be used for
glImportMemoryFdEXT() failure checking.

Won't hurt to print error messages instead of failing silently.

-- 
Best regards,
Dmitry
RE: [PATCH v2 4/6] ui/console-gl: Add a helper to create a texture with linear memory layout
Posted by Kasireddy, Vivek 1 week ago
Hi Dmitry,

> Subject: Re: [PATCH v2 4/6] ui/console-gl: Add a helper to create a texture
> with linear memory layout
> 
> On 3/26/25 02:39, Vivek Kasireddy wrote:
> > +void surface_gl_create_texture_from_fd(DisplaySurface *surface,
> > +                                       int fd, GLuint *texture)
> > +{
> > +    unsigned long size = surface_stride(surface) * surface_height(surface);
> > +    GLuint mem_obj;
> > +
> > +    if (!epoxy_has_gl_extension("GL_EXT_memory_object") ||
> > +        !epoxy_has_gl_extension("GL_EXT_memory_object_fd")) {
> > +        return;
> > +    }
> > +
> > +#ifdef GL_EXT_memory_object_fd
> > +    glCreateMemoryObjectsEXT(1, &mem_obj);
> > +    glImportMemoryFdEXT(mem_obj, size,
> GL_HANDLE_TYPE_OPAQUE_FD_EXT, fd);
> > +    if (!glIsMemoryObjectEXT(mem_obj)) {
> 
> This check should always succeed. glGetError() should be used for
> glImportMemoryFdEXT() failure checking.
> 
> Won't hurt to print error messages instead of failing silently.
Makes sense; will add glGetError() and error messages in the next version.

Thanks,
Vivek

> 
> --
> Best regards,
> Dmitry