yagl_gles_texture_set_internalformat(tex_target_state->texture,
internalformat,
- (is_float ? GL_FLOAT : 0));
+ (is_float ? GL_FLOAT : 0),
+ yagl_gles_context_convert_textures(ctx));
out:
YAGL_LOG_FUNC_EXIT(NULL);
yagl_gles_texture_set_internalformat(tex_target_state->texture,
internalformat,
- type);
+ type,
+ yagl_gles_context_convert_textures(ctx));
out:
YAGL_LOG_FUNC_EXIT(NULL);
goto out;
}
- yagl_gles_texture_set_immutable(tex_target_state->texture, base_internalformat, type);
+ yagl_gles_texture_set_immutable(tex_target_state->texture,
+ base_internalformat,
+ type,
+ yagl_gles_context_convert_textures(ctx));
out:
YAGL_LOG_FUNC_EXIT(NULL);
}
}
+int yagl_gles_context_convert_textures(struct yagl_gles_context *ctx)
+{
+ /*
+ * Currently GLESv1_CM is implemented via legacy context always, so
+ * don't convert textures in this case.
+ */
+ return (ctx->base.client_api != yagl_client_api_gles1) &&
+ (yagl_get_host_gl_version() > yagl_gl_2);
+}
+
int yagl_gles_context_validate_texture_target(struct yagl_gles_context *ctx,
GLenum target,
yagl_gles_texture_target *texture_target)
break;
}
- if (yagl_get_host_gl_version() <= yagl_gl_2) {
+ if (yagl_gles_context_convert_textures(ctx)) {
switch (format) {
case GL_ALPHA:
switch (type) {
- YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE);
- YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_ALPHA, GL_ALPHA, GL_FLOAT);
- YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_ALPHA, GL_ALPHA, GL_FLOAT);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
}
break;
case GL_LUMINANCE:
switch (type) {
- YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE);
- YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
- YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
}
break;
case GL_LUMINANCE_ALPHA:
switch (type) {
- YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
- YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
- YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
}
break;
}
switch (format) {
case GL_ALPHA:
switch (type) {
- YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE);
- YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_ALPHA, GL_ALPHA, GL_FLOAT);
- YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_ALPHA, GL_ALPHA, GL_FLOAT);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES);
}
break;
case GL_LUMINANCE:
switch (type) {
- YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE);
- YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
- YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES);
}
break;
case GL_LUMINANCE_ALPHA:
switch (type) {
- YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
- YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
- YAGL_PIXEL_FORMAT_CASE(gles_gl3, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT);
+ YAGL_PIXEL_FORMAT_CASE(gles_gl2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES);
}
break;
}
goto out;
}
- if (yagl_get_host_gl_version() <= yagl_gl_2) {
+ if (yagl_gles_context_convert_textures(ctx)) {
switch (*internalformat) {
case GL_ALPHA:
case GL_LUMINANCE_ALPHA:
if (readbuffer_format_num_components == 4) {
+ *internalformat = GL_RGBA;
res = 1;
goto out;
}
break;
case GL_LUMINANCE:
res = 1;
+ *internalformat = GL_RGBA;
goto out;
}
} else {
case GL_ALPHA:
case GL_LUMINANCE_ALPHA:
if (readbuffer_format_num_components == 4) {
- *internalformat = GL_RGBA;
res = 1;
goto out;
}
break;
case GL_LUMINANCE:
res = 1;
- *internalformat = GL_RGBA;
goto out;
}
}
goto out;
}
- if (yagl_get_host_gl_version() <= yagl_gl_2) {
+ if (yagl_gles_context_convert_textures(ctx)) {
switch (*internalformat) {
case GL_ALPHA:
+ *internalformat = GL_RGBA;
*base_internalformat = GL_ALPHA;
- *any_format = GL_ALPHA;
+ *any_format = GL_BGRA;
*any_type = GL_UNSIGNED_BYTE;
break;
case GL_LUMINANCE:
+ *internalformat = GL_RGBA;
*base_internalformat = GL_LUMINANCE;
- *any_format = GL_LUMINANCE;
+ *any_format = GL_BGRA;
*any_type = GL_UNSIGNED_BYTE;
break;
case GL_LUMINANCE_ALPHA:
+ *internalformat = GL_RGBA;
*base_internalformat = GL_LUMINANCE_ALPHA;
- *any_format = GL_LUMINANCE_ALPHA;
+ *any_format = GL_BGRA;
*any_type = GL_UNSIGNED_BYTE;
break;
default:
} else {
switch (*internalformat) {
case GL_ALPHA:
- *internalformat = GL_RGBA;
*base_internalformat = GL_ALPHA;
- *any_format = GL_BGRA;
+ *any_format = GL_ALPHA;
*any_type = GL_UNSIGNED_BYTE;
break;
case GL_LUMINANCE:
- *internalformat = GL_RGBA;
*base_internalformat = GL_LUMINANCE;
- *any_format = GL_BGRA;
+ *any_format = GL_LUMINANCE;
*any_type = GL_UNSIGNED_BYTE;
break;
case GL_LUMINANCE_ALPHA:
- *internalformat = GL_RGBA;
*base_internalformat = GL_LUMINANCE_ALPHA;
- *any_format = GL_BGRA;
+ *any_format = GL_LUMINANCE_ALPHA;
*any_type = GL_UNSIGNED_BYTE;
break;
default:
void yagl_gles_context_unbind_vertex_array(struct yagl_gles_context *ctx,
yagl_object_name va_local_name);
+int yagl_gles_context_convert_textures(struct yagl_gles_context *ctx);
+
int yagl_gles_context_validate_texture_target(struct yagl_gles_context *ctx,
GLenum target,
yagl_gles_texture_target *texture_target);
for (i = 0; i < height; ++i) {
for (j = 0; j < width; ++j) {
- *(uint32_t*)(dst + j * 4) = ((uint32_t)(*(uint8_t*)(src + j)) << 24) | 0xFFFFFF;
+ *(uint32_t*)(dst + j * 4) = ((uint32_t)(*(uint8_t*)(src + j)) << 24);
}
src += src_stride;
dst += dst_stride;
for (i = 0; i < height; ++i) {
for (j = 0; j < width; ++j) {
- *(GLfloat*)(dst + j * 16 + 0) = 1.0f;
- *(GLfloat*)(dst + j * 16 + 4) = 1.0f;
- *(GLfloat*)(dst + j * 16 + 8) = 1.0f;
+ *(GLfloat*)(dst + j * 16 + 0) = 0.0f;
+ *(GLfloat*)(dst + j * 16 + 4) = 0.0f;
+ *(GLfloat*)(dst + j * 16 + 8) = 0.0f;
*(uint32_t*)(dst + j * 16 + 12) = *(uint32_t*)(src + j * 4);
}
src += src_stride;
for (i = 0; i < height; ++i) {
for (j = 0; j < width; ++j) {
- *(uint16_t*)(dst + j * 8 + 0) = YAGL_HALF_FLOAT_1_0;
- *(uint16_t*)(dst + j * 8 + 2) = YAGL_HALF_FLOAT_1_0;
- *(uint16_t*)(dst + j * 8 + 4) = YAGL_HALF_FLOAT_1_0;
+ *(uint16_t*)(dst + j * 8 + 0) = 0;
+ *(uint16_t*)(dst + j * 8 + 2) = 0;
+ *(uint16_t*)(dst + j * 8 + 4) = 0;
*(uint16_t*)(dst + j * 8 + 6) = *(uint16_t*)(src + j * 2);
}
src += src_stride;
*/
#define GL_HALF_FLOAT_OES 0x8D61
-static void yagl_gles_texture_set_swizzle(struct yagl_gles_texture *texture,
- GLenum internalformat)
+static void yagl_gles_texture_swizzle(struct yagl_gles_texture *texture,
+ GLenum internalformat)
{
- if (yagl_get_host_gl_version() > yagl_gl_2) {
- switch (internalformat) {
- case GL_ALPHA:
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_ONE);
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_ONE);
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_ONE);
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
- break;
- case GL_LUMINANCE:
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_RED);
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_RED);
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_RED);
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ONE);
- break;
- case GL_LUMINANCE_ALPHA:
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_RED);
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_RED);
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_RED);
- yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
- break;
- }
+ switch (internalformat) {
+ case GL_ALPHA:
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_ZERO);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_ZERO);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_ZERO);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
+ break;
+ case GL_LUMINANCE:
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_RED);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_RED);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_RED);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ONE);
+ break;
+ case GL_LUMINANCE_ALPHA:
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_R, GL_RED);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_G, GL_RED);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_B, GL_RED);
+ yagl_host_glTexParameteri(texture->target, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
+ break;
}
}
void yagl_gles_texture_set_internalformat(struct yagl_gles_texture *texture,
GLenum internalformat,
- GLenum type)
+ GLenum type,
+ int swizzle)
{
texture->internalformat = internalformat;
break;
}
- yagl_gles_texture_set_swizzle(texture, internalformat);
+ if (swizzle) {
+ yagl_gles_texture_swizzle(texture, internalformat);
+ }
}
void yagl_gles_texture_set_immutable(struct yagl_gles_texture *texture,
GLenum internalformat,
- GLenum type)
+ GLenum type,
+ int swizzle)
{
texture->immutable = GL_TRUE;
texture->internalformat = internalformat;
break;
}
- yagl_gles_texture_set_swizzle(texture, internalformat);
+ if (swizzle) {
+ yagl_gles_texture_swizzle(texture, internalformat);
+ }
}
int yagl_gles_texture_color_renderable(struct yagl_gles_texture *texture)
void yagl_gles_texture_set_internalformat(struct yagl_gles_texture *texture,
GLenum internalformat,
- GLenum type);
+ GLenum type,
+ int swizzle);
void yagl_gles_texture_set_immutable(struct yagl_gles_texture *texture,
GLenum internalformat,
- GLenum type);
+ GLenum type,
+ int swizzle);
int yagl_gles_texture_color_renderable(struct yagl_gles_texture *texture);
yagl_gles_texture_set_internalformat(texture,
fmt_desc->uncomp_format,
- fmt_desc->pixel_type);
+ fmt_desc->pixel_type,
+ yagl_gles_context_convert_textures(ctx));
return;
}
yagl_gles_texture_set_internalformat(texture,
fmt_desc->uncomp_format,
- fmt_desc->pixel_type);
+ fmt_desc->pixel_type,
+ yagl_gles_context_convert_textures(ctx));
}
static void yagl_gles1_etc1_rgb8_uncomp_and_apply(struct yagl_gles_context *ctx,
yagl_gles_texture_set_internalformat(texture,
GL_RGBA8,
- GL_UNSIGNED_BYTE);
+ GL_UNSIGNED_BYTE,
+ yagl_gles_context_convert_textures(ctx));
return;
}
yagl_gles_texture_set_internalformat(texture,
GL_RGBA8,
- GL_UNSIGNED_BYTE);
+ GL_UNSIGNED_BYTE,
+ yagl_gles_context_convert_textures(ctx));
}
static void yagl_gles1_context_compressed_tex_image_2d(struct yagl_gles_context *ctx,
yagl_gles_texture_set_internalformat(tex_target_state->texture,
internalformat,
- type);
+ type,
+ yagl_gles_context_convert_textures(&ctx->base));
out:
YAGL_LOG_FUNC_EXIT(NULL);
goto out;
}
- yagl_gles_texture_set_immutable(tex_target_state->texture, base_internalformat, type);
+ yagl_gles_texture_set_immutable(tex_target_state->texture,
+ base_internalformat,
+ type,
+ yagl_gles_context_convert_textures(&ctx->base));
out:
YAGL_LOG_FUNC_EXIT(NULL);
yagl_gles_texture_set_internalformat(texture,
tc_format->dst_internalformat,
- tc_format->dst_type);
+ tc_format->dst_type,
+ yagl_gles_context_convert_textures(gles_ctx));
return;
}
yagl_gles_texture_set_internalformat(texture,
tc_format->dst_internalformat,
- tc_format->dst_type);
+ tc_format->dst_type,
+ yagl_gles_context_convert_textures(gles_ctx));
}
void yagl_gles2_context_compressed_tex_sub_image_2d(struct yagl_gles_context *gles_ctx,
yagl_gles_texture_set_internalformat(texture,
tc_format->dst_internalformat,
- tc_format->dst_type);
+ tc_format->dst_type,
+ yagl_gles_context_convert_textures(&ctx->base));
return;
}
yagl_gles_texture_set_internalformat(texture,
tc_format->dst_internalformat,
- tc_format->dst_type);
+ tc_format->dst_type,
+ yagl_gles_context_convert_textures(&ctx->base));
}
void yagl_gles2_context_compressed_tex_sub_image_3d(struct yagl_gles2_context *ctx,