mesa: add GL_OES_copy_image support

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Ilia Mirkin
2016-02-15 20:34:52 -05:00
parent 571f538a62
commit ebdb534548
8 changed files with 151 additions and 2 deletions

View File

@@ -256,7 +256,7 @@ GLES3.2, GLSL ES 3.2
GL_KHR_debug DONE (all drivers)
GL_KHR_robustness not started (90% done with the ARB variant)
GL_KHR_texture_compression_astc_ldr DONE (i965/gen9+)
GL_OES_copy_image not started (based on GL_ARB_copy_image, which is done for some drivers)
GL_OES_copy_image DONE (core only)
GL_OES_draw_buffers_indexed not started
GL_OES_draw_elements_base_vertex DONE (all drivers)
GL_OES_geometry_shader started (Marta)

View File

@@ -1013,6 +1013,28 @@
</category>
<category name="GL_OES_copy_image" number="208">
<function name="CopyImageSubDataOES" alias="CopyImageSubData" es2="3.0">
<param name="srcName" type="GLuint"/>
<param name="srcTarget" type="GLenum"/>
<param name="srcLevel" type="GLint"/>
<param name="srcX" type="GLint"/>
<param name="srcY" type="GLint"/>
<param name="srcZ" type="GLint"/>
<param name="dstName" type="GLuint"/>
<param name="dstTarget" type="GLenum"/>
<param name="dstLevel" type="GLint"/>
<param name="dstX" type="GLint"/>
<param name="dstY" type="GLint"/>
<param name="dstZ" type="GLint"/>
<param name="srcWidth" type="GLsizei"/>
<param name="srcHeight" type="GLsizei"/>
<param name="srcDepth" type="GLsizei"/>
</function>
</category>
<!-- 175. GL_OES_geometry_shader -->
<category name="GL_OES_geometry_shader" number="210">
<enum name="GEOMETRY_SHADER_OES" value="0x8DD9"/>

View File

@@ -25,6 +25,7 @@
* Jason Ekstrand <jason.ekstrand@intel.com>
*/
#include "context.h"
#include "glheader.h"
#include "errors.h"
#include "enums.h"
@@ -360,8 +361,32 @@ compressed_format_compatible(const struct gl_context *ctx,
case GL_COMPRESSED_SIGNED_RED_RGTC1:
compressedClass = BLOCK_CLASS_64_BITS;
break;
case GL_COMPRESSED_RGBA8_ETC2_EAC:
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
case GL_COMPRESSED_RG11_EAC:
case GL_COMPRESSED_SIGNED_RG11_EAC:
if (_mesa_is_gles(ctx))
compressedClass = BLOCK_CLASS_128_BITS;
else
return false;
break;
case GL_COMPRESSED_RGB8_ETC2:
case GL_COMPRESSED_SRGB8_ETC2:
case GL_COMPRESSED_R11_EAC:
case GL_COMPRESSED_SIGNED_R11_EAC:
case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
if (_mesa_is_gles(ctx))
compressedClass = BLOCK_CLASS_64_BITS;
else
return false;
break;
default:
return false;
if (_mesa_is_gles(ctx) && _mesa_is_astc_format(compressedFormat))
compressedClass = BLOCK_CLASS_128_BITS;
else
return false;
break;
}
switch (otherFormat) {

View File

@@ -309,6 +309,7 @@ EXT(OES_blend_subtract , dummy_true
EXT(OES_byte_coordinates , dummy_true , x , x , ES1, x , 2002)
EXT(OES_compressed_ETC1_RGB8_texture , OES_compressed_ETC1_RGB8_texture , x , x , ES1, ES2, 2005)
EXT(OES_compressed_paletted_texture , dummy_true , x , x , ES1, x , 2003)
EXT(OES_copy_image , OES_copy_image , x , x , x , 30, 2014)
EXT(OES_depth24 , dummy_true , x , x , ES1, ES2, 2005)
EXT(OES_depth32 , dummy_false , x , x , x , x , 2005)
EXT(OES_depth_texture , ARB_depth_texture , x , x , x , ES2, 2006)

View File

@@ -3911,6 +3911,7 @@ struct gl_extensions
GLboolean EXT_transform_feedback;
GLboolean EXT_timer_query;
GLboolean EXT_vertex_array_bgra;
GLboolean OES_copy_image;
GLboolean OES_sample_variables;
GLboolean OES_standard_derivatives;
GLboolean OES_texture_buffer;

View File

@@ -2457,6 +2457,9 @@ const struct function gles3_functions_possible[] = {
/* GL_OES_sample_shading */
{ "glMinSampleShadingOES", 30, -1 },
/* GL_OES_copy_image */
{ "glCopyImageSubDataOES", 30, -1 },
{ NULL, 0, -1 }
};

View File

@@ -82,6 +82,39 @@
| | COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT |
---------------------------------------------------------------------------
*/
#define VIEW_CLASS_GLES(x) (GL_VIEW_CLASS_BPTC_FLOAT + 1 + x)
#define VIEW_CLASS_EAC_R11 VIEW_CLASS_GLES(0)
#define VIEW_CLASS_EAC_RG11 VIEW_CLASS_GLES(1)
#define VIEW_CLASS_ETC2_RGB VIEW_CLASS_GLES(2)
#define VIEW_CLASS_ETC2_RGBA VIEW_CLASS_GLES(3)
#define VIEW_CLASS_ETC2_EAC_RGBA VIEW_CLASS_GLES(4)
#define VIEW_CLASS_ASTC_4x4_RGBA VIEW_CLASS_GLES(5)
#define VIEW_CLASS_ASTC_5x4_RGBA VIEW_CLASS_GLES(6)
#define VIEW_CLASS_ASTC_5x5_RGBA VIEW_CLASS_GLES(7)
#define VIEW_CLASS_ASTC_6x5_RGBA VIEW_CLASS_GLES(8)
#define VIEW_CLASS_ASTC_6x6_RGBA VIEW_CLASS_GLES(9)
#define VIEW_CLASS_ASTC_8x5_RGBA VIEW_CLASS_GLES(10)
#define VIEW_CLASS_ASTC_8x6_RGBA VIEW_CLASS_GLES(11)
#define VIEW_CLASS_ASTC_8x8_RGBA VIEW_CLASS_GLES(12)
#define VIEW_CLASS_ASTC_10x5_RGBA VIEW_CLASS_GLES(13)
#define VIEW_CLASS_ASTC_10x6_RGBA VIEW_CLASS_GLES(14)
#define VIEW_CLASS_ASTC_10x8_RGBA VIEW_CLASS_GLES(15)
#define VIEW_CLASS_ASTC_10x10_RGBA VIEW_CLASS_GLES(16)
#define VIEW_CLASS_ASTC_12x10_RGBA VIEW_CLASS_GLES(17)
#define VIEW_CLASS_ASTC_12x12_RGBA VIEW_CLASS_GLES(18)
#define VIEW_CLASS_ASTC_3x3x3_RGBA VIEW_CLASS_GLES(19)
#define VIEW_CLASS_ASTC_4x3x3_RGBA VIEW_CLASS_GLES(20)
#define VIEW_CLASS_ASTC_4x4x3_RGBA VIEW_CLASS_GLES(21)
#define VIEW_CLASS_ASTC_4x4x4_RGBA VIEW_CLASS_GLES(22)
#define VIEW_CLASS_ASTC_5x4x4_RGBA VIEW_CLASS_GLES(23)
#define VIEW_CLASS_ASTC_5x5x4_RGBA VIEW_CLASS_GLES(24)
#define VIEW_CLASS_ASTC_5x5x5_RGBA VIEW_CLASS_GLES(25)
#define VIEW_CLASS_ASTC_6x5x5_RGBA VIEW_CLASS_GLES(26)
#define VIEW_CLASS_ASTC_6x6x5_RGBA VIEW_CLASS_GLES(27)
#define VIEW_CLASS_ASTC_6x6x6_RGBA VIEW_CLASS_GLES(28)
struct internal_format_class_info {
GLenum view_class;
GLenum internal_format;
@@ -162,6 +195,41 @@ static const struct internal_format_class_info s3tc_compatible_internal_formats[
{GL_VIEW_CLASS_S3TC_DXT5_RGBA, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT},
};
static const struct internal_format_class_info gles_etc2_compatible_internal_formats[] = {
{VIEW_CLASS_EAC_R11, GL_COMPRESSED_R11_EAC},
{VIEW_CLASS_EAC_R11, GL_COMPRESSED_SIGNED_R11_EAC},
{VIEW_CLASS_EAC_RG11, GL_COMPRESSED_RG11_EAC},
{VIEW_CLASS_EAC_RG11, GL_COMPRESSED_SIGNED_RG11_EAC},
{VIEW_CLASS_ETC2_RGB, GL_COMPRESSED_RGB8_ETC2},
{VIEW_CLASS_ETC2_RGB, GL_COMPRESSED_SRGB8_ETC2},
{VIEW_CLASS_ETC2_RGBA, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2},
{VIEW_CLASS_ETC2_RGBA, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2},
{VIEW_CLASS_ETC2_EAC_RGBA, GL_COMPRESSED_RGBA8_ETC2_EAC},
{VIEW_CLASS_ETC2_EAC_RGBA, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC},
};
static const struct internal_format_class_info gles_astc_compatible_internal_formats[] = {
#define ASTC_FMT(size) \
{VIEW_CLASS_ASTC_##size## _RGBA, GL_COMPRESSED_RGBA_ASTC_##size##_KHR}, \
{VIEW_CLASS_ASTC_##size##_RGBA, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_##size##_KHR}
ASTC_FMT(4x4),
ASTC_FMT(5x4),
ASTC_FMT(5x5),
ASTC_FMT(6x5),
ASTC_FMT(6x6),
ASTC_FMT(8x5),
ASTC_FMT(8x6),
ASTC_FMT(8x8),
ASTC_FMT(10x5),
ASTC_FMT(10x6),
ASTC_FMT(10x8),
ASTC_FMT(10x10),
ASTC_FMT(12x10),
ASTC_FMT(12x12),
#undef ASTC_FMT
};
GLenum
_mesa_texture_view_lookup_view_class(const struct gl_context *ctx, GLenum internalformat)
{
@@ -180,6 +248,24 @@ _mesa_texture_view_lookup_view_class(const struct gl_context *ctx, GLenum intern
return s3tc_compatible_internal_formats[i].view_class;
}
}
if (_mesa_is_gles3(ctx)) {
for (i = 0; i < ARRAY_SIZE(gles_etc2_compatible_internal_formats); i++) {
if (gles_etc2_compatible_internal_formats[i].internal_format
== internalformat)
return gles_etc2_compatible_internal_formats[i].view_class;
}
if (ctx->Extensions.KHR_texture_compression_astc_ldr) {
for (i = 0; i < ARRAY_SIZE(gles_astc_compatible_internal_formats); i++) {
if (gles_astc_compatible_internal_formats[i].internal_format
== internalformat)
return gles_astc_compatible_internal_formats[i].view_class;
}
}
/* FINISHME: Add 3D OES formats when supported */
}
return GL_FALSE;
}

View File

@@ -927,6 +927,17 @@ void st_init_extensions(struct pipe_screen *screen,
extensions->OES_sample_variables = extensions->ARB_sample_shading &&
extensions->ARB_gpu_shader5;
/* If we don't have native ETC2 support, we don't keep track of the
* original ETC2 data. This is necessary to be able to copy images between
* compatible view classes.
*/
if (extensions->ARB_copy_image && screen->is_format_supported(
screen, PIPE_FORMAT_ETC2_RGB8,
PIPE_TEXTURE_2D, 0,
PIPE_BIND_SAMPLER_VIEW)) {
extensions->OES_copy_image = GL_TRUE;
}
/* Maximum sample count. */
{
enum pipe_format color_formats[] = {