summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Vorobiov <s.vorobiov@samsung.com>2014-01-21 13:04:32 +0400
committerStanislav Vorobiov <s.vorobiov@samsung.com>2014-01-21 13:04:32 +0400
commite4375884a3edad22b1be49bca4030bfd787d0c26 (patch)
treea3c90f07caaebd20767039289de3aa3b76881413
parent27e361414d875f6284c92ec9d86e4320dc859261 (diff)
downloademulator-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.c38
-rw-r--r--GLES_common/yagl_gles_context.h40
-rw-r--r--GLESv1_CM/yagl_gles1_context.c42
-rw-r--r--GLESv2/yagl_gles2_calls.c116
-rw-r--r--GLESv2/yagl_gles2_context.c207
-rw-r--r--GLESv2/yagl_gles2_context.h64
-rw-r--r--GLESv2/yagl_gles3_context.c4
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;