ui/console-gl: Add a helper to create a texture with linear memory layout
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> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Co-developed-by: Michael Scherle <michael.scherle@rz.uni-freiburg.de> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Message-Id: <20250617043546.1022779-6-vivek.kasireddy@intel.com>
This commit is contained in:
parent
50d135e377
commit
e6f0fe8f7c
2 changed files with 51 additions and 0 deletions
|
|
@ -25,6 +25,7 @@
|
|||
* THE SOFTWARE.
|
||||
*/
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "ui/console.h"
|
||||
#include "ui/shader.h"
|
||||
|
||||
|
|
@ -96,6 +97,53 @@ void surface_gl_create_texture(QemuGLShader *gls,
|
|||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
}
|
||||
|
||||
bool surface_gl_create_texture_from_fd(DisplaySurface *surface,
|
||||
int fd, GLuint *texture,
|
||||
GLuint *mem_obj)
|
||||
{
|
||||
unsigned long size = surface_stride(surface) * surface_height(surface);
|
||||
GLenum err = glGetError();
|
||||
*texture = 0;
|
||||
*mem_obj = 0;
|
||||
|
||||
if (!epoxy_has_gl_extension("GL_EXT_memory_object") ||
|
||||
!epoxy_has_gl_extension("GL_EXT_memory_object_fd")) {
|
||||
error_report("spice: required OpenGL extensions not supported: "
|
||||
"GL_EXT_memory_object and GL_EXT_memory_object_fd");
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef GL_EXT_memory_object_fd
|
||||
glCreateMemoryObjectsEXT(1, mem_obj);
|
||||
glImportMemoryFdEXT(*mem_obj, size, GL_HANDLE_TYPE_OPAQUE_FD_EXT, fd);
|
||||
|
||||
err = glGetError();
|
||||
if (err != GL_NO_ERROR) {
|
||||
error_report("spice: cannot import memory object from fd");
|
||||
goto cleanup_mem;
|
||||
}
|
||||
|
||||
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);
|
||||
err = glGetError();
|
||||
if (err != GL_NO_ERROR) {
|
||||
error_report("spice: cannot create texture from memory object");
|
||||
goto cleanup_tex_and_mem;
|
||||
}
|
||||
return true;
|
||||
|
||||
cleanup_tex_and_mem:
|
||||
glDeleteTextures(1, texture);
|
||||
cleanup_mem:
|
||||
glDeleteMemoryObjectsEXT(1, mem_obj);
|
||||
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
void surface_gl_update_texture(QemuGLShader *gls,
|
||||
DisplaySurface *surface,
|
||||
int x, int y, int w, int h)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue