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:
@@ -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)
|
||||
|
@@ -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"/>
|
||||
|
@@ -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) {
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
@@ -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 }
|
||||
};
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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[] = {
|
||||
|
Reference in New Issue
Block a user