diff options
-rw-r--r-- | GLES_common/yagl_gles_calls.c | 4 | ||||
-rw-r--r-- | GLES_common/yagl_gles_context.c | 5 | ||||
-rw-r--r-- | GLES_common/yagl_gles_context.h | 4 | ||||
-rw-r--r-- | GLESv1_CM/yagl_gles1_context.c | 6 | ||||
-rw-r--r-- | GLESv2/yagl_gles2_calls.c | 5 | ||||
-rw-r--r-- | GLESv2/yagl_gles2_context.c | 6 | ||||
-rw-r--r-- | GLESv2/yagl_gles3_context.c | 15 |
7 files changed, 45 insertions, 0 deletions
diff --git a/GLES_common/yagl_gles_calls.c b/GLES_common/yagl_gles_calls.c index 90ece0b..22e4c20 100644 --- a/GLES_common/yagl_gles_calls.c +++ b/GLES_common/yagl_gles_calls.c @@ -2511,6 +2511,10 @@ YAGL_API void glBlitFramebuffer(GLint srcX0, GLint srcY0, goto out; } + if (!yagl_gles_context_validate_framebuffer_blit(ctx)) { + goto out; + } + read_status = yagl_gles_context_check_framebuffer_status(ctx, ctx->fbo_read); diff --git a/GLES_common/yagl_gles_context.c b/GLES_common/yagl_gles_context.c index 3b6f14d..ec9937f 100644 --- a/GLES_common/yagl_gles_context.c +++ b/GLES_common/yagl_gles_context.c @@ -905,6 +905,11 @@ int yagl_gles_context_validate_renderbuffer_format(struct yagl_gles_context *ctx return res; } +int yagl_gles_context_validate_framebuffer_blit(struct yagl_gles_context *ctx) +{ + return ctx->validate_framebuffer_blit(ctx); +} + void yagl_gles_context_set_active_texture(struct yagl_gles_context *ctx, GLenum texture) { diff --git a/GLES_common/yagl_gles_context.h b/GLES_common/yagl_gles_context.h index 6f2f517..5167e84 100644 --- a/GLES_common/yagl_gles_context.h +++ b/GLES_common/yagl_gles_context.h @@ -158,6 +158,8 @@ struct yagl_gles_context int (*validate_renderbuffer_format)(struct yagl_gles_context */*ctx*/, GLenum */*internalformat*/); + int (*validate_framebuffer_blit)(struct yagl_gles_context */*ctx*/); + void (*hint)(struct yagl_gles_context */*ctx*/, GLenum /*target*/, GLenum /*mode*/); @@ -357,6 +359,8 @@ int yagl_gles_context_validate_texstorage_format(struct yagl_gles_context *ctx, int yagl_gles_context_validate_renderbuffer_format(struct yagl_gles_context *ctx, GLenum *internalformat); +int yagl_gles_context_validate_framebuffer_blit(struct yagl_gles_context *ctx); + void yagl_gles_context_set_active_texture(struct yagl_gles_context *ctx, GLenum texture); diff --git a/GLESv1_CM/yagl_gles1_context.c b/GLESv1_CM/yagl_gles1_context.c index d2af36a..1f641c6 100644 --- a/GLESv1_CM/yagl_gles1_context.c +++ b/GLESv1_CM/yagl_gles1_context.c @@ -1501,6 +1501,11 @@ static int yagl_gles1_context_validate_renderbuffer_format(struct yagl_gles_cont return 0; } +static int yagl_gles1_context_validate_framebuffer_blit(struct yagl_gles_context *ctx) +{ + return 1; +} + static void yagl_gles1_context_hint(struct yagl_gles_context *ctx, GLenum target, GLenum mode) @@ -1540,6 +1545,7 @@ struct yagl_client_context *yagl_gles1_context_create(struct yagl_sharegroup *sg gles1_ctx->base.validate_copyteximage_format = &yagl_gles1_context_validate_copyteximage_format; gles1_ctx->base.validate_texstorage_format = &yagl_gles1_context_validate_texstorage_format; gles1_ctx->base.validate_renderbuffer_format = &yagl_gles1_context_validate_renderbuffer_format; + gles1_ctx->base.validate_framebuffer_blit = &yagl_gles1_context_validate_framebuffer_blit; gles1_ctx->base.hint = &yagl_gles1_context_hint; YAGL_LOG_FUNC_EXIT("%p", gles1_ctx); diff --git a/GLESv2/yagl_gles2_calls.c b/GLESv2/yagl_gles2_calls.c index 661603b..45befd7 100644 --- a/GLESv2/yagl_gles2_calls.c +++ b/GLESv2/yagl_gles2_calls.c @@ -1293,6 +1293,11 @@ YAGL_API void glLinkProgram(GLuint program) goto out; } + if (!program_obj->vertex_shader || !program_obj->fragment_shader) { + YAGL_SET_ERR(GL_INVALID_OPERATION); + goto out; + } + if (!ctx->pre_link_program(ctx, program_obj)) { goto out; } diff --git a/GLESv2/yagl_gles2_context.c b/GLESv2/yagl_gles2_context.c index 0949ccf..46e3991 100644 --- a/GLESv2/yagl_gles2_context.c +++ b/GLESv2/yagl_gles2_context.c @@ -1386,6 +1386,11 @@ int yagl_gles2_context_validate_renderbuffer_format(struct yagl_gles_context *ct return 0; } +static int yagl_gles2_context_validate_framebuffer_blit(struct yagl_gles_context *ctx) +{ + return 1; +} + void yagl_gles2_context_hint(struct yagl_gles_context *ctx, GLenum target, GLenum mode) @@ -1461,6 +1466,7 @@ struct yagl_client_context *yagl_gles2_context_create(struct yagl_sharegroup *sg gles2_ctx->base.validate_copyteximage_format = &yagl_gles2_context_validate_copyteximage_format; gles2_ctx->base.validate_texstorage_format = &yagl_gles2_context_validate_texstorage_format; gles2_ctx->base.validate_renderbuffer_format = &yagl_gles2_context_validate_renderbuffer_format; + gles2_ctx->base.validate_framebuffer_blit = &yagl_gles2_context_validate_framebuffer_blit; gles2_ctx->base.hint = &yagl_gles2_context_hint; gles2_ctx->get_programiv = &yagl_gles2_context_get_programiv; gles2_ctx->pre_use_program = &yagl_gles2_context_pre_use_program; diff --git a/GLESv2/yagl_gles3_context.c b/GLESv2/yagl_gles3_context.c index ff90c4b..846ac7f 100644 --- a/GLESv2/yagl_gles3_context.c +++ b/GLESv2/yagl_gles3_context.c @@ -1553,6 +1553,20 @@ static int yagl_gles3_context_validate_renderbuffer_format(struct yagl_gles_cont return 1; } +static int yagl_gles3_context_validate_framebuffer_blit(struct yagl_gles_context *gles_ctx) +{ + struct yagl_gles3_context *ctx = (struct yagl_gles3_context*)gles_ctx; + + YAGL_LOG_FUNC_SET(glBlitFramebuffer); + + if (ctx->base.base.fbo_read == ctx->base.base.fbo_draw) { + YAGL_SET_ERR(GL_INVALID_OPERATION); + return 0; + } + + return 1; +} + static void yagl_gles3_context_hint(struct yagl_gles_context *gles_ctx, GLenum target, GLenum mode) @@ -1672,6 +1686,7 @@ struct yagl_client_context *yagl_gles3_context_create(struct yagl_sharegroup *sg gles3_ctx->base.base.validate_copyteximage_format = &yagl_gles3_context_validate_copyteximage_format; gles3_ctx->base.base.validate_texstorage_format = &yagl_gles3_context_validate_texstorage_format; gles3_ctx->base.base.validate_renderbuffer_format = &yagl_gles3_context_validate_renderbuffer_format; + gles3_ctx->base.base.validate_framebuffer_blit = &yagl_gles3_context_validate_framebuffer_blit; gles3_ctx->base.base.hint = &yagl_gles3_context_hint; gles3_ctx->base.get_programiv = &yagl_gles3_context_get_programiv; gles3_ctx->base.pre_use_program = &yagl_gles3_context_pre_use_program; |