diff options
author | Stanislav Vorobiov <s.vorobiov@samsung.com> | 2014-01-21 13:04:32 +0400 |
---|---|---|
committer | Stanislav Vorobiov <s.vorobiov@samsung.com> | 2014-01-21 13:04:32 +0400 |
commit | e4375884a3edad22b1be49bca4030bfd787d0c26 (patch) | |
tree | a3c90f07caaebd20767039289de3aa3b76881413 | |
parent | 27e361414d875f6284c92ec9d86e4320dc859261 (diff) | |
download | emulator-yagl-e4375884a3edad22b1be49bca4030bfd787d0c26.tar.gz emulator-yagl-e4375884a3edad22b1be49bca4030bfd787d0c26.tar.bz2 emulator-yagl-e4375884a3edad22b1be49bca4030bfd787d0c26.zip |
YaGL: Implemented GL_OES_texture_3D compressed API
Compressed API part of GL_OES_texture_3D is now
implemented
Change-Id: Ie53238ef69a33715c75202549a6027191b0c84e3
-rw-r--r-- | GLES_common/yagl_gles_calls.c | 38 | ||||
-rw-r--r-- | GLES_common/yagl_gles_context.h | 40 | ||||
-rw-r--r-- | GLESv1_CM/yagl_gles1_context.c | 42 | ||||
-rw-r--r-- | GLESv2/yagl_gles2_calls.c | 116 | ||||
-rw-r--r-- | GLESv2/yagl_gles2_context.c | 207 | ||||
-rw-r--r-- | GLESv2/yagl_gles2_context.h | 64 | ||||
-rw-r--r-- | GLESv2/yagl_gles3_context.c | 4 |
7 files changed, 398 insertions, 113 deletions
diff --git a/GLES_common/yagl_gles_calls.c b/GLES_common/yagl_gles_calls.c index f2984e4..1ba923b 100644 --- a/GLES_common/yagl_gles_calls.c +++ b/GLES_common/yagl_gles_calls.c @@ -682,15 +682,15 @@ YAGL_API void glCompressedTexImage2D(GLenum target, GLint level, GLenum internal } } - ctx->compressed_tex_image(ctx, - target, - level, - internalformat, - width, - height, - border, - imageSize, - data); + ctx->compressed_tex_image_2d(ctx, + target, + level, + internalformat, + width, + height, + border, + imageSize, + data); if (width != 0) { yagl_gles_context_post_unpack(ctx, 1); @@ -724,16 +724,16 @@ YAGL_API void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffse assert(!using_pbo); - ctx->compressed_tex_sub_image(ctx, - target, - level, - xoffset, - yoffset, - width, - height, - format, - imageSize, - data); + ctx->compressed_tex_sub_image_2d(ctx, + target, + level, + xoffset, + yoffset, + width, + height, + format, + imageSize, + data); if (width != 0) { yagl_gles_context_post_unpack(ctx, 1); diff --git a/GLES_common/yagl_gles_context.h b/GLES_common/yagl_gles_context.h index 989774e..0488008 100644 --- a/GLES_common/yagl_gles_context.h +++ b/GLES_common/yagl_gles_context.h @@ -22,26 +22,26 @@ struct yagl_gles_context const GLchar *(*get_string)(struct yagl_gles_context */*ctx*/, GLenum /*name*/); - void (*compressed_tex_image)(struct yagl_gles_context */*ctx*/, - GLenum /*target*/, - GLint /*level*/, - GLenum /*internalformat*/, - GLsizei /*width*/, - GLsizei /*height*/, - GLint /*border*/, - GLsizei /*imageSize*/, - const GLvoid */*data*/); - - void (*compressed_tex_sub_image)(struct yagl_gles_context */*ctx*/, - GLenum /*target*/, - GLint /*level*/, - GLint /*xoffset*/, - GLint /*yoffset*/, - GLsizei /*width*/, - GLsizei /*height*/, - GLenum /*format*/, - GLsizei /*imageSize*/, - const GLvoid */*data*/); + void (*compressed_tex_image_2d)(struct yagl_gles_context */*ctx*/, + GLenum /*target*/, + GLint /*level*/, + GLenum /*internalformat*/, + GLsizei /*width*/, + GLsizei /*height*/, + GLint /*border*/, + GLsizei /*imageSize*/, + const GLvoid */*data*/); + + void (*compressed_tex_sub_image_2d)(struct yagl_gles_context */*ctx*/, + GLenum /*target*/, + GLint /*level*/, + GLint /*xoffset*/, + GLint /*yoffset*/, + GLsizei /*width*/, + GLsizei /*height*/, + GLenum /*format*/, + GLsizei /*imageSize*/, + const GLvoid */*data*/); int (*enable)(struct yagl_gles_context */*ctx*/, GLenum /*cap*/, diff --git a/GLESv1_CM/yagl_gles1_context.c b/GLESv1_CM/yagl_gles1_context.c index a5c0308..aa7b3cf 100644 --- a/GLESv1_CM/yagl_gles1_context.c +++ b/GLESv1_CM/yagl_gles1_context.c @@ -647,15 +647,15 @@ static void yagl_gles1_cpal_tex_uncomp_and_apply(struct yagl_gles_context *ctx, } } -static void yagl_gles1_context_compressed_tex_image(struct yagl_gles_context *ctx, - GLenum target, - GLint level, - GLenum internalformat, - GLsizei width, - GLsizei height, - GLint border, - GLsizei imageSize, - const GLvoid *data) +static void yagl_gles1_context_compressed_tex_image_2d(struct yagl_gles_context *ctx, + GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLsizei imageSize, + const GLvoid *data) { const int max_tex_size = ((struct yagl_gles1_context*)ctx)->max_tex_size; YaglGles1PalFmtDesc fmt_desc; @@ -692,16 +692,16 @@ static void yagl_gles1_context_compressed_tex_image(struct yagl_gles_context *ct } } -static void yagl_gles1_context_compressed_tex_sub_image(struct yagl_gles_context *ctx, - GLenum target, - GLint level, - GLint xoffset, - GLint yoffset, - GLsizei width, - GLsizei height, - GLenum format, - GLsizei imageSize, - const GLvoid *data) +static void yagl_gles1_context_compressed_tex_sub_image_2d(struct yagl_gles_context *ctx, + GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + const GLvoid *data) { YAGL_LOG_FUNC_SET(glCompressedTexSubImage2D); @@ -1346,8 +1346,8 @@ struct yagl_client_context *yagl_gles1_context_create(struct yagl_sharegroup *sg gles1_ctx->base.base.destroy = &yagl_gles1_context_destroy; gles1_ctx->base.create_arrays = &yagl_gles1_context_create_arrays; gles1_ctx->base.get_string = &yagl_gles1_context_get_string; - gles1_ctx->base.compressed_tex_image = &yagl_gles1_context_compressed_tex_image; - gles1_ctx->base.compressed_tex_sub_image = &yagl_gles1_context_compressed_tex_sub_image; + gles1_ctx->base.compressed_tex_image_2d = &yagl_gles1_context_compressed_tex_image_2d; + gles1_ctx->base.compressed_tex_sub_image_2d = &yagl_gles1_context_compressed_tex_sub_image_2d; gles1_ctx->base.enable = &yagl_gles1_context_enable; gles1_ctx->base.is_enabled = &yagl_gles1_context_is_enabled; gles1_ctx->base.get_integerv = &yagl_gles1_context_get_integerv; diff --git a/GLESv2/yagl_gles2_calls.c b/GLESv2/yagl_gles2_calls.c index de1dfac..889001d 100644 --- a/GLESv2/yagl_gles2_calls.c +++ b/GLESv2/yagl_gles2_calls.c @@ -2300,21 +2300,117 @@ YAGL_API YAGL_ALIAS(glCopyTexSubImage3D, glCopyTexSubImage3DOES); YAGL_API void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data) { - /* - * TODO: Implement - */ - assert(0); - exit(5); + yagl_gles_texture_target texture_target; + int using_pbo = 0; + + YAGL_LOG_FUNC_ENTER_SPLIT9(glCompressedTexImage3D, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*, target, level, internalformat, width, height, depth, border, imageSize, data); + + YAGL_GET_CTX(); + + if (!yagl_gles_context_validate_texture_target(&ctx->base, + target, + &texture_target)) { + YAGL_SET_ERR(GL_INVALID_ENUM); + goto out; + } + + if (!yagl_gles2_is_texture_target_layered(target)) { + YAGL_SET_ERR(GL_INVALID_ENUM); + goto out; + } + + if ((width < 0) || (height < 0) || (depth < 0)) { + YAGL_SET_ERR(GL_INVALID_VALUE); + goto out; + } + + if ((width == 0) || (height == 0) || (depth == 0)) { + width = height = depth = 0; + } + + if ((width != 0) && !yagl_gles_context_pre_unpack(&ctx->base, &data, 1, &using_pbo)) { + YAGL_SET_ERR(GL_INVALID_OPERATION); + goto out; + } + + assert(!using_pbo); + + yagl_gles2_context_compressed_tex_image_3d(ctx, + target, + level, + internalformat, + width, + height, + depth, + border, + imageSize, + data); + + if (width != 0) { + yagl_gles_context_post_unpack(&ctx->base, 1); + } + +out: + YAGL_LOG_FUNC_EXIT(NULL); } YAGL_API YAGL_ALIAS(glCompressedTexImage3D, glCompressedTexImage3DOES); YAGL_API void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data) { - /* - * TODO: Implement - */ - assert(0); - exit(5); + yagl_gles_texture_target texture_target; + int using_pbo = 0; + + YAGL_LOG_FUNC_ENTER_SPLIT11(glCompressedTexSubImage3D, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + + YAGL_GET_CTX(); + + if (!yagl_gles_context_validate_texture_target(&ctx->base, + target, + &texture_target)) { + YAGL_SET_ERR(GL_INVALID_ENUM); + goto out; + } + + if (!yagl_gles2_is_texture_target_layered(target)) { + YAGL_SET_ERR(GL_INVALID_ENUM); + goto out; + } + + if ((width < 0) || (height < 0) || (depth < 0)) { + YAGL_SET_ERR(GL_INVALID_VALUE); + goto out; + } + + if ((width == 0) || (height == 0) || (depth == 0)) { + width = height = depth = 0; + } + + if ((width != 0) && !yagl_gles_context_pre_unpack(&ctx->base, &data, 1, &using_pbo)) { + YAGL_SET_ERR(GL_INVALID_OPERATION); + goto out; + } + + assert(!using_pbo); + + yagl_gles2_context_compressed_tex_sub_image_3d(ctx, + target, + level, + xoffset, + yoffset, + zoffset, + width, + height, + depth, + format, + imageSize, + data); + + if (width != 0) { + yagl_gles_context_post_unpack(&ctx->base, 1); + } + +out: + YAGL_LOG_FUNC_EXIT(NULL); } YAGL_API YAGL_ALIAS(glCompressedTexSubImage3D, glCompressedTexSubImage3DOES); diff --git a/GLESv2/yagl_gles2_context.c b/GLESv2/yagl_gles2_context.c index 3f0a01a..372cbf9 100644 --- a/GLESv2/yagl_gles2_context.c +++ b/GLESv2/yagl_gles2_context.c @@ -362,15 +362,15 @@ struct yagl_gles_array return arrays; } -void yagl_gles2_context_compressed_tex_image(struct yagl_gles_context *gles_ctx, - GLenum target, - GLint level, - GLenum internalformat, - GLsizei width, - GLsizei height, - GLint border, - GLsizei imageSize, - const GLvoid *data) +void yagl_gles2_context_compressed_tex_image_2d(struct yagl_gles_context *gles_ctx, + GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLsizei imageSize, + const GLvoid *data) { struct yagl_gles2_context *ctx = (struct yagl_gles2_context*)gles_ctx; struct yagl_texcompress_format *tc_format; @@ -432,16 +432,16 @@ void yagl_gles2_context_compressed_tex_image(struct yagl_gles_context *gles_ctx, } } -void yagl_gles2_context_compressed_tex_sub_image(struct yagl_gles_context *gles_ctx, - GLenum target, - GLint level, - GLint xoffset, - GLint yoffset, - GLsizei width, - GLsizei height, - GLenum format, - GLsizei imageSize, - const GLvoid *data) +void yagl_gles2_context_compressed_tex_sub_image_2d(struct yagl_gles_context *gles_ctx, + GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + const GLvoid *data) { struct yagl_gles2_context *ctx = (struct yagl_gles2_context*)gles_ctx; struct yagl_texcompress_format *tc_format; @@ -503,6 +503,171 @@ void yagl_gles2_context_compressed_tex_sub_image(struct yagl_gles_context *gles_ } } +void yagl_gles2_context_compressed_tex_image_3d(struct yagl_gles2_context *ctx, + GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLint border, + GLsizei imageSize, + const GLvoid *data) +{ + GLsizei singleImageSize = 0; + struct yagl_texcompress_format *tc_format; + GLsizei src_stride; + GLsizei dst_stride; + GLsizei dst_size; + uint8_t *buff, *tmp; + GLint saved_alignment; + GLsizei i; + + YAGL_LOG_FUNC_SET(glCompressedTexImage3D); + + tc_format = yagl_texcompress_get_format(internalformat); + + if (!tc_format) { + YAGL_SET_ERR(GL_INVALID_ENUM); + return; + } + + if (depth > 0) { + singleImageSize = imageSize / depth; + } + + if (!yagl_texcompress_get_info(tc_format, + width, + height, + singleImageSize, + &src_stride, + &dst_stride, + &dst_size)) { + YAGL_SET_ERR(GL_INVALID_VALUE); + return; + } + + buff = tmp = yagl_get_tmp_buffer(dst_size * depth); + + for (i = 0; i < depth; ++i) { + tc_format->unpack(tc_format, + data, + width, + height, + src_stride, + tmp, + dst_stride); + data += singleImageSize; + tmp += dst_size; + } + + saved_alignment = ctx->base.unpack.alignment; + + if (saved_alignment != 1) { + yagl_host_glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + } + + yagl_host_glTexImage3DData(target, + level, + tc_format->dst_internalformat, + width, + height, + depth, + border, + tc_format->dst_format, + tc_format->dst_type, + buff, + dst_size * depth); + + if (saved_alignment != 1) { + yagl_host_glPixelStorei(GL_UNPACK_ALIGNMENT, saved_alignment); + } +} + +void yagl_gles2_context_compressed_tex_sub_image_3d(struct yagl_gles2_context *ctx, + GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint zoffset, + GLsizei width, + GLsizei height, + GLsizei depth, + GLenum format, + GLsizei imageSize, + const GLvoid *data) +{ + GLsizei singleImageSize = 0; + struct yagl_texcompress_format *tc_format; + GLsizei src_stride; + GLsizei dst_stride; + GLsizei dst_size; + uint8_t *buff, *tmp; + GLint saved_alignment; + GLsizei i; + + YAGL_LOG_FUNC_SET(glCompressedTexSubImage2D); + + tc_format = yagl_texcompress_get_format(format); + + if (!tc_format) { + YAGL_SET_ERR(GL_INVALID_ENUM); + return; + } + + if (depth > 0) { + singleImageSize = imageSize / depth; + } + + if (!yagl_texcompress_get_info(tc_format, + width, + height, + singleImageSize, + &src_stride, + &dst_stride, + &dst_size)) { + YAGL_SET_ERR(GL_INVALID_VALUE); + return; + } + + buff = tmp = yagl_get_tmp_buffer(dst_size * depth); + + for (i = 0; i < depth; ++i) { + tc_format->unpack(tc_format, + data, + width, + height, + src_stride, + tmp, + dst_stride); + data += singleImageSize; + tmp += dst_size; + } + + saved_alignment = ctx->base.unpack.alignment; + + if (saved_alignment != 1) { + yagl_host_glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + } + + yagl_host_glTexSubImage3DData(target, + level, + xoffset, + yoffset, + zoffset, + width, + height, + depth, + tc_format->dst_format, + tc_format->dst_type, + buff, + dst_size * depth); + + if (saved_alignment != 1) { + yagl_host_glPixelStorei(GL_UNPACK_ALIGNMENT, saved_alignment); + } +} + int yagl_gles2_context_get_integerv(struct yagl_gles_context *ctx, GLenum pname, GLint *params, @@ -792,8 +957,8 @@ struct yagl_client_context *yagl_gles2_context_create(struct yagl_sharegroup *sg gles2_ctx->base.base.destroy = &yagl_gles2_context_destroy; gles2_ctx->base.create_arrays = &yagl_gles2_context_create_arrays; gles2_ctx->base.get_string = &yagl_gles2_context_get_string; - gles2_ctx->base.compressed_tex_image = &yagl_gles2_context_compressed_tex_image; - gles2_ctx->base.compressed_tex_sub_image = &yagl_gles2_context_compressed_tex_sub_image; + gles2_ctx->base.compressed_tex_image_2d = &yagl_gles2_context_compressed_tex_image_2d; + gles2_ctx->base.compressed_tex_sub_image_2d = &yagl_gles2_context_compressed_tex_sub_image_2d; gles2_ctx->base.enable = &yagl_gles2_context_enable; gles2_ctx->base.is_enabled = &yagl_gles2_context_is_enabled; gles2_ctx->base.get_integerv = &yagl_gles2_context_get_integerv; diff --git a/GLESv2/yagl_gles2_context.h b/GLESv2/yagl_gles2_context.h index 40974b2..6f9f5d7 100644 --- a/GLESv2/yagl_gles2_context.h +++ b/GLESv2/yagl_gles2_context.h @@ -56,26 +56,50 @@ void yagl_gles2_context_prepare(struct yagl_gles2_context *ctx); struct yagl_gles_array *yagl_gles2_context_create_arrays(struct yagl_gles_context *ctx); -void yagl_gles2_context_compressed_tex_image(struct yagl_gles_context *ctx, - GLenum target, - GLint level, - GLenum internalformat, - GLsizei width, - GLsizei height, - GLint border, - GLsizei imageSize, - const GLvoid *data); - -void yagl_gles2_context_compressed_tex_sub_image(struct yagl_gles_context *ctx, - GLenum target, - GLint level, - GLint xoffset, - GLint yoffset, - GLsizei width, - GLsizei height, - GLenum format, - GLsizei imageSize, - const GLvoid *data); +void yagl_gles2_context_compressed_tex_image_2d(struct yagl_gles_context *ctx, + GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLsizei imageSize, + const GLvoid *data); + +void yagl_gles2_context_compressed_tex_sub_image_2d(struct yagl_gles_context *ctx, + GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + const GLvoid *data); + +void yagl_gles2_context_compressed_tex_image_3d(struct yagl_gles2_context *ctx, + GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLint border, + GLsizei imageSize, + const GLvoid *data); + +void yagl_gles2_context_compressed_tex_sub_image_3d(struct yagl_gles2_context *ctx, + GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint zoffset, + GLsizei width, + GLsizei height, + GLsizei depth, + GLenum format, + GLsizei imageSize, + const GLvoid *data); int yagl_gles2_context_get_integerv(struct yagl_gles_context *ctx, GLenum pname, diff --git a/GLESv2/yagl_gles3_context.c b/GLESv2/yagl_gles3_context.c index 222d1c9..74459ca 100644 --- a/GLESv2/yagl_gles3_context.c +++ b/GLESv2/yagl_gles3_context.c @@ -914,8 +914,8 @@ struct yagl_client_context *yagl_gles3_context_create(struct yagl_sharegroup *sg gles3_ctx->base.base.base.destroy = &yagl_gles3_context_destroy; gles3_ctx->base.base.create_arrays = &yagl_gles2_context_create_arrays; gles3_ctx->base.base.get_string = &yagl_gles3_context_get_string; - gles3_ctx->base.base.compressed_tex_image = &yagl_gles2_context_compressed_tex_image; - gles3_ctx->base.base.compressed_tex_sub_image = &yagl_gles2_context_compressed_tex_sub_image; + gles3_ctx->base.base.compressed_tex_image_2d = &yagl_gles2_context_compressed_tex_image_2d; + gles3_ctx->base.base.compressed_tex_sub_image_2d = &yagl_gles2_context_compressed_tex_sub_image_2d; gles3_ctx->base.base.enable = &yagl_gles3_context_enable; gles3_ctx->base.base.is_enabled = &yagl_gles3_context_is_enabled; gles3_ctx->base.base.get_integerv = &yagl_gles3_context_get_integerv; |