summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbyungchul.so <byungchul.so@samsung.com>2021-12-13 13:03:33 +0900
committerbyungchul.so <byungchul.so@samsung.com>2021-12-21 13:39:34 +0900
commit38fdedfce6472804c3700a5a4dbeab1feecd07ec (patch)
tree46daef653aab66886f86121de6e13645ddb8c0f1
parenta3c51bd11da9896d651f82b4491b05b92922248c (diff)
downloademulator-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.c4
-rw-r--r--GLES_common/yagl_gles_context.c16
-rw-r--r--GLES_common/yagl_gles_context.h5
-rw-r--r--GLESv1_CM/yagl_gles1_context.c5
-rw-r--r--GLESv2/yagl_gles2_context.c10
-rw-r--r--GLESv2/yagl_gles2_context.h2
-rw-r--r--GLESv2/yagl_gles3_context.c6
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;