Invoke yagl_gles2_context_prepare_framebuffer in glClear for GLESv2/GLESv3 sandbox/byungchul.so/fix-tbmbuffer-offscreen
authorbyungchul.so <byungchul.so@samsung.com>
Mon, 13 Dec 2021 04:03:33 +0000 (13:03 +0900)
committerbyungchul.so <byungchul.so@samsung.com>
Tue, 14 Dec 2021 03:27:21 +0000 (12:27 +0900)
- 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.

GLES_common/yagl_gles_calls.c
GLES_common/yagl_gles_context.c
GLES_common/yagl_gles_context.h
GLESv1_CM/yagl_gles1_context.c
GLESv2/yagl_gles2_context.c
GLESv2/yagl_gles2_context.h
GLESv2/yagl_gles3_context.c

index 7e5d7635fb46e9f93e2266c865447d969b59ab9b..6a60449bf5f000410a3ab5e805b6ebf917d95a78 100644 (file)
@@ -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);
 }
index b57d949250a9f4deefe1ee0faf772f9100ef61eb..00c21ad4921436ea886de194e253a4bb1e8a6638 100644 (file)
@@ -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);
+}
index ca3f43fbddb44f5abeee6dd9277d5d01f9fe42e9..2962cb0047a870b2982b851a0a5d7535d2ae00bd 100644 (file)
@@ -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
index f51200a957e59e48fc277193a71f29156b22c6e3..7f899cf002795e418e5e4b23500d1d8351b4e094 100644 (file)
@@ -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);
 
index fa67c7520517eebc6d230818e3c6dd463bdb17bf..c373e530a529be86f166c1cf70df8f82a6cf5ffa 100644 (file)
@@ -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;
index d306223bb874ce5b8b6a4db513ed3068cb6238ae..a2ae3e4c2ad33a8e462f8c7994dc7145e77a92f7 100644 (file)
@@ -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,
index 846ac7fed46814037d01a9cb82886f2e57e9ac44..7ac5e4f8b2b38d22afd7cacb0cf2cc688f41449b 100644 (file)
@@ -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;