diff options
author | byungchul.so <byungchul.so@samsung.com> | 2021-12-13 13:03:33 +0900 |
---|---|---|
committer | byungchul.so <byungchul.so@samsung.com> | 2021-12-21 13:39:34 +0900 |
commit | 38fdedfce6472804c3700a5a4dbeab1feecd07ec (patch) | |
tree | 46daef653aab66886f86121de6e13645ddb8c0f1 | |
parent | a3c51bd11da9896d651f82b4491b05b92922248c (diff) | |
download | emulator-yagl-38fdedfce6472804c3700a5a4dbeab1feecd07ec.tar.gz emulator-yagl-38fdedfce6472804c3700a5a4dbeab1feecd07ec.tar.bz2 emulator-yagl-38fdedfce6472804c3700a5a4dbeab1feecd07ec.zip |
Invoke yagl_gles2_context_prepare_framebuffer in glClear for GLESv2/GLESv3submit/tizen/20211224.014123accepted/tizen/unified/20211227.122832
- glClear can be used to clear entire framebuffer. Therefore invoke
yagl_gles2_context_prepare_framebuffer in glClear for GLESv2/GLESv3
to write back clear result if the fb is binded with texture that
targets from an eglimage.
Change-Id: I591bdb1a6ebfd36afc948a070dd25089fed5be60
-rw-r--r-- | GLES_common/yagl_gles_calls.c | 4 | ||||
-rw-r--r-- | GLES_common/yagl_gles_context.c | 16 | ||||
-rw-r--r-- | GLES_common/yagl_gles_context.h | 5 | ||||
-rw-r--r-- | GLESv1_CM/yagl_gles1_context.c | 5 | ||||
-rw-r--r-- | GLESv2/yagl_gles2_context.c | 10 | ||||
-rw-r--r-- | GLESv2/yagl_gles2_context.h | 2 | ||||
-rw-r--r-- | GLESv2/yagl_gles3_context.c | 6 |
7 files changed, 44 insertions, 4 deletions
diff --git a/GLES_common/yagl_gles_calls.c b/GLES_common/yagl_gles_calls.c index 7e5d763..6a60449 100644 --- a/GLES_common/yagl_gles_calls.c +++ b/GLES_common/yagl_gles_calls.c @@ -760,9 +760,7 @@ YAGL_API void glClear(GLbitfield mask) YAGL_GET_CTX(); - yagl_render_invalidate((mask & GL_COLOR_BUFFER_BIT)); - - yagl_host_glClear(mask); + yagl_gles_context_clear(ctx, mask); YAGL_LOG_FUNC_EXIT(NULL); } diff --git a/GLES_common/yagl_gles_context.c b/GLES_common/yagl_gles_context.c index b57d949..00c21ad 100644 --- a/GLES_common/yagl_gles_context.c +++ b/GLES_common/yagl_gles_context.c @@ -2539,3 +2539,19 @@ void yagl_gles_context_hint(struct yagl_gles_context *ctx, yagl_host_glHint(target, mode); } + +void yagl_gles_context_clear(struct yagl_gles_context *ctx, GLbitfield mask) +{ + YAGL_LOG_FUNC_SET(yagl_gles_context_clear); + + if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) { + YAGL_SET_ERR(GL_INVALID_VALUE); + return; + } + + yagl_render_invalidate((mask & GL_COLOR_BUFFER_BIT)); + + ctx->clear(ctx); + + yagl_host_glClear(mask); +} diff --git a/GLES_common/yagl_gles_context.h b/GLES_common/yagl_gles_context.h index ca3f43f..2962cb0 100644 --- a/GLES_common/yagl_gles_context.h +++ b/GLES_common/yagl_gles_context.h @@ -164,6 +164,8 @@ struct yagl_gles_context GLenum /*target*/, GLenum /*mode*/); + void (*clear)(struct yagl_gles_context */*ctx*/); + struct yagl_namespace framebuffers; struct yagl_namespace vertex_arrays; @@ -515,4 +517,7 @@ void yagl_gles_context_hint(struct yagl_gles_context *ctx, GLenum target, GLenum mode); +void yagl_gles_context_clear(struct yagl_gles_context *ctx, + GLbitfield mask); + #endif diff --git a/GLESv1_CM/yagl_gles1_context.c b/GLESv1_CM/yagl_gles1_context.c index f51200a..7f899cf 100644 --- a/GLESv1_CM/yagl_gles1_context.c +++ b/GLESv1_CM/yagl_gles1_context.c @@ -1556,6 +1556,10 @@ static void yagl_gles1_context_hint(struct yagl_gles_context *ctx, { } +static void yagl_gles1_context_clear(struct yagl_gles_context *ctx) +{ +} + struct yagl_client_context *yagl_gles1_context_create(struct yagl_sharegroup *sg) { struct yagl_gles1_context *gles1_ctx; @@ -1591,6 +1595,7 @@ struct yagl_client_context *yagl_gles1_context_create(struct yagl_sharegroup *sg 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; + gles1_ctx->base.clear = &yagl_gles1_context_clear; YAGL_LOG_FUNC_EXIT("%p", gles1_ctx); diff --git a/GLESv2/yagl_gles2_context.c b/GLESv2/yagl_gles2_context.c index fa67c75..c373e53 100644 --- a/GLESv2/yagl_gles2_context.c +++ b/GLESv2/yagl_gles2_context.c @@ -270,7 +270,7 @@ static void yagl_gles2_context_prepare_framebuffer(struct yagl_gles2_context *ct yagl_gles_framebuffer_texture2d(fb, fb->target, GL_COLOR_ATTACHMENT0 + i, - yagl_gles_framebuffer_attachment_color0, + yagl_gles_framebuffer_attachment_color0 + i, state.textarget, 0, state.texture); @@ -1548,6 +1548,13 @@ void yagl_gles2_context_hint(struct yagl_gles_context *ctx, { } +void yagl_gles2_context_clear(struct yagl_gles_context *gles_ctx) +{ + struct yagl_gles2_context *ctx = (struct yagl_gles2_context *)gles_ctx; + + yagl_gles2_context_prepare_framebuffer(ctx, ctx->base.fbo_draw); +} + int yagl_gles2_context_get_programiv(struct yagl_gles2_context *ctx, struct yagl_gles2_program *program, GLenum pname, @@ -1619,6 +1626,7 @@ struct yagl_client_context *yagl_gles2_context_create(struct yagl_sharegroup *sg 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->base.clear = &yagl_gles2_context_clear; gles2_ctx->get_programiv = &yagl_gles2_context_get_programiv; gles2_ctx->pre_use_program = &yagl_gles2_context_pre_use_program; gles2_ctx->pre_link_program = &yagl_gles2_context_pre_link_program; diff --git a/GLESv2/yagl_gles2_context.h b/GLESv2/yagl_gles2_context.h index d306223..a2ae3e4 100644 --- a/GLESv2/yagl_gles2_context.h +++ b/GLESv2/yagl_gles2_context.h @@ -282,6 +282,8 @@ void yagl_gles2_context_hint(struct yagl_gles_context *ctx, GLenum target, GLenum mode); +void yagl_gles2_context_clear(struct yagl_gles_context *ctx); + int yagl_gles2_context_get_programiv(struct yagl_gles2_context *ctx, struct yagl_gles2_program *program, GLenum pname, diff --git a/GLESv2/yagl_gles3_context.c b/GLESv2/yagl_gles3_context.c index 846ac7f..7ac5e4f 100644 --- a/GLESv2/yagl_gles3_context.c +++ b/GLESv2/yagl_gles3_context.c @@ -1583,6 +1583,11 @@ static void yagl_gles3_context_hint(struct yagl_gles_context *gles_ctx, } } +static void yagl_gles3_context_clear(struct yagl_gles_context *gles_ctx) +{ + yagl_gles2_context_clear(gles_ctx); +} + static int yagl_gles3_context_get_programiv(struct yagl_gles2_context *ctx, struct yagl_gles2_program *program, GLenum pname, @@ -1688,6 +1693,7 @@ struct yagl_client_context *yagl_gles3_context_create(struct yagl_sharegroup *sg 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.base.clear = &yagl_gles3_context_clear; gles3_ctx->base.get_programiv = &yagl_gles3_context_get_programiv; gles3_ctx->base.pre_use_program = &yagl_gles3_context_pre_use_program; gles3_ctx->base.pre_link_program = &yagl_gles3_context_pre_link_program; |