[Spice-devel] [PATCH RFC 06/12] Add get_texture_raw_data to extract raw data from a texture
Frediano Ziglio
fziglio at redhat.com
Fri Jul 15 13:49:31 UTC 2016
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
server/egl.c | 29 +++++++++++++++++++++++++++++
server/egl.h | 3 +++
2 files changed, 32 insertions(+)
diff --git a/server/egl.c b/server/egl.c
index 9bfa413..b791c95 100644
--- a/server/egl.c
+++ b/server/egl.c
@@ -64,6 +64,35 @@ void *egl_own_context(void *egl_display, void *egl_context)
return ectx;
}
+static EGLContext egl_context = EGL_NO_CONTEXT;
+
+void *get_texture_raw_data(RedGlTexture *texture, size_t *data_size)
+{
+ if (egl_context == EGL_NO_CONTEXT) {
+ EGLBoolean b;
+ b = eglMakeCurrent(texture->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, texture->egl_context);
+ spice_assert(b != EGL_FALSE);
+ }
+
+ glBindTexture(GL_TEXTURE_2D, texture->tex_id);
+ GLint w = 0, h = 0;
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
+ if (w == 0 || h == 0)
+ return NULL;
+ size_t tex_size = w * h * 4;
+ uint8_t *data = spice_malloc(tex_size);
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_BYTE, data);
+ if (w > texture->width) {
+ int y;
+ for (y = 1; y < texture->height; ++y)
+ memmove(data + texture->width * 4 * y, data + w * 4 * y, texture->width * 4);
+ tex_size = texture->width * texture->height * 4;
+ }
+ *data_size = tex_size;
+ return data;
+}
+
int egl_get_fd_for_texture(void *egl_display, void *egl_context,
uint32_t tex_id,
uint32_t *stride, uint32_t *fourcc)
diff --git a/server/egl.h b/server/egl.h
index 6360a8a..cb3f92c 100644
--- a/server/egl.h
+++ b/server/egl.h
@@ -18,6 +18,9 @@
#ifndef EGL_H_
#define EGL_H_
+#include "red-qxl.h"
+
+void *get_texture_raw_data(RedGlTexture *texture, size_t *data_size);
int egl_get_fd_for_texture(void *egl_display, void *egl_context,
uint32_t tex_id,
uint32_t *stride, uint32_t *fourcc);
--
2.7.4
More information about the Spice-devel
mailing list