yagl_egl_context_update_surfaces(prev_ctx, NULL, NULL);
}
+ YAGL_LOG_TRACE("Context switched (%u, %u, %u, %u)",
+ dpy_,
+ draw_,
+ read_,
+ ctx_);
+
ret = EGL_TRUE;
out:
target_ulong /* void* */ pixels_,
target_ulong /* const EGLint* */ attrib_list_)
{
- YAGL_UNIMPLEMENTED(eglCreatePixmapSurfaceOffscreenYAGL, 0);
+ yagl_host_handle ret = 0;
+ EGLint *attrib_list = NULL;
+ struct yagl_compiled_transfer *bimage_ct = NULL;
+ struct yagl_egl_pixmap_attribs attribs;
+ struct yagl_egl_display *dpy = NULL;
+ struct yagl_egl_config *config = NULL;
+ struct yagl_egl_surface *surface = NULL;
+
+ YAGL_LOG_FUNC_SET_TS(egl_api_ts->ts, eglCreatePixmapSurfaceOffscreenYAGL);
+
+ if (attrib_list_) {
+ attrib_list = yagl_mem_get_attrib_list(egl_api_ts->ts,
+ attrib_list_);
+
+ if (!attrib_list) {
+ YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
+ goto out;
+ }
+ }
+
+ bimage_ct = yagl_compiled_transfer_create(egl_api_ts->ts,
+ pixels_,
+ (width * height * bpp),
+ true);
+
+ if (!bimage_ct) {
+ YAGL_SET_ERR(EGL_BAD_NATIVE_PIXMAP);
+ goto out;
+ }
+
+ yagl_egl_pixmap_attribs_init(&attribs);
+
+ if (!yagl_egl_is_attrib_list_empty(attrib_list)) {
+ YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
+ goto out;
+ }
+
+ if (!yagl_validate_display(dpy_, &dpy)) {
+ goto out;
+ }
+
+ if (!yagl_validate_config(dpy, config_, &config)) {
+ goto out;
+ }
+
+ surface = yagl_egl_surface_create_pixmap(dpy,
+ config,
+ &attribs,
+ bimage_ct,
+ width,
+ height,
+ bpp);
+
+ if (!surface) {
+ YAGL_SET_ERR(EGL_BAD_ALLOC);
+ goto out;
+ }
+
+ /*
+ * Owned by 'surface' now.
+ */
+ bimage_ct = NULL;
+
+ yagl_egl_display_add_surface(dpy, surface);
+ yagl_egl_surface_release(surface);
+
+ ret = surface->res.handle;
+
+out:
+ yagl_egl_config_release(config);
+ if (bimage_ct) {
+ yagl_compiled_transfer_destroy(bimage_ct);
+ }
+ g_free(attrib_list);
+
+ return ret;
}
EGLBoolean yagl_host_eglResizeOffscreenSurfaceYAGL(yagl_host_handle dpy_,
YAGL_GET_CTX(glGetBooleanv);
if (!ctx->get_param_count(ctx, pname, &count)) {
+ YAGL_LOG_ERROR("Bad pname = 0x%X", pname);
YAGL_SET_ERR(GL_INVALID_ENUM);
goto out;
}
if (params_) {
for (i = 0; i < count; ++i) {
- yagl_mem_put_GLuint(ts,
- params_ + (i * sizeof(*params)),
- params[i]);
+ yagl_mem_put_GLboolean(ts,
+ params_ + (i * sizeof(*params)),
+ params[i]);
}
}
YAGL_GET_CTX(glGetFloatv);
if (!ctx->get_param_count(ctx, pname, &count)) {
+ YAGL_LOG_ERROR("Bad pname = 0x%X", pname);
YAGL_SET_ERR(GL_INVALID_ENUM);
goto out;
}
if (params_) {
for (i = 0; i < count; ++i) {
- yagl_mem_put_GLuint(ts,
- params_ + (i * sizeof(*params)),
- params[i]);
+ yagl_mem_put_GLfloat(ts,
+ params_ + (i * sizeof(*params)),
+ params[i]);
}
}
YAGL_GET_CTX(glGetIntegerv);
if (!ctx->get_param_count(ctx, pname, &count)) {
+ YAGL_LOG_ERROR("Bad pname = 0x%X", pname);
YAGL_SET_ERR(GL_INVALID_ENUM);
goto out;
}
GLsizei height,
GLenum format,
GLenum type,
- target_ulong /* GLvoid* */ pixels)
+ target_ulong /* GLvoid* */ pixels_)
{
- YAGL_UNIMPLEMENTED(glReadPixels);
+ yagl_object_name current_pbo = 0;
+ GLvoid *pixels = NULL;
+ GLsizei stride = 0;
+
+ YAGL_GET_CTX(glReadPixels);
+
+ if (pixels_ && (width > 0) && (height > 0)) {
+ if (!yagl_get_stride(ctx->driver_ps,
+ GL_PACK_ALIGNMENT,
+ width,
+ format,
+ type,
+ &stride)) {
+ YAGL_SET_ERR(GL_INVALID_VALUE);
+ goto out;
+ }
+ pixels = yagl_gles_context_malloc(ctx, stride * height);
+ ctx->driver_ps->GetIntegerv(ctx->driver_ps,
+ GL_PIXEL_PACK_BUFFER_BINDING_ARB,
+ (GLint*)¤t_pbo);
+ if (current_pbo != 0) {
+ ctx->driver_ps->BindBuffer(ctx->driver_ps,
+ GL_PIXEL_PACK_BUFFER_ARB,
+ 0);
+ }
+
+ ctx->driver_ps->ReadPixels(ctx->driver_ps,
+ x,
+ y,
+ width,
+ height,
+ format,
+ type,
+ pixels);
+
+ if (current_pbo != 0) {
+ ctx->driver_ps->BindBuffer(ctx->driver_ps,
+ GL_PIXEL_PACK_BUFFER_ARB,
+ current_pbo);
+ }
+
+ yagl_mem_put(ts, pixels_, stride * height, pixels);
+ }
+
+out:
+ (void)0;
}
void yagl_host_glSampleCoverage(GLclampf value,
GLsizei height,
GLenum format,
GLenum type,
- target_ulong /* GLvoid* */ pixels);
+ target_ulong /* GLvoid* */ pixels_);
void yagl_host_glSampleCoverage(GLclampf value,
GLboolean invert);
void yagl_host_glScissor(GLint x,
#include "yagl_thread.h"
#include "yagl_sharegroup.h"
#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
#include "yagl_gles2_driver.h"
static void yagl_gles2_array_apply(struct yagl_gles_array *array)
case GL_TEXTURE_BINDING_CUBE_MAP: *count = 1; break;
case GL_UNPACK_ALIGNMENT: *count = 1; break;
case GL_VIEWPORT: *count = 4; break;
+ case GL_MAX_SAMPLES_IMG: *count = 1; break;
default: return false;
}
return true;
#define yagl_mem_get_GLsizei(ts, va, value) yagl_mem_get_int32((ts), (va), (value))
#define yagl_mem_put_GLenum(ts, va, value) yagl_mem_put_uint32((ts), (va), (value))
#define yagl_mem_get_GLenum(ts, va, value) yagl_mem_get_uint32((ts), (va), (value))
+#define yagl_mem_put_GLfloat(ts, va, value) yagl_mem_put_float((ts), (va), (value))
+#define yagl_mem_get_GLfloat(ts, va, value) yagl_mem_get_float((ts), (va), (value))
+#define yagl_mem_put_GLboolean(ts, va, value) yagl_mem_put_uint8((ts), (va), (value))
+#define yagl_mem_get_GLboolean(ts, va, value) yagl_mem_get_uint8((ts), (va), (value))
#endif
/*
* Whenever protocol changes be sure to bump this.
*/
-#define YAGL_VERSION 5
+#define YAGL_VERSION 6
#endif