st/mesa: implement ASTC 2D LDR fallback for all drivers
Tested-by: Mike Lothian <mike@fireburn.co.uk> Tested-By: Gert Wollny<gert.wollny@collabora.com> Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de> Reviewed-By: Gert Wollny <gw.fossdev@gmail.com>
This commit is contained in:
@@ -41,6 +41,7 @@
|
||||
#include "main/pbo.h"
|
||||
#include "main/pixeltransfer.h"
|
||||
#include "main/texcompress.h"
|
||||
#include "main/texcompress_astc.h"
|
||||
#include "main/texcompress_etc.h"
|
||||
#include "main/texgetimage.h"
|
||||
#include "main/teximage.h"
|
||||
@@ -227,6 +228,9 @@ st_compressed_format_fallback(struct st_context *st, mesa_format format)
|
||||
if (_mesa_is_format_etc2(format))
|
||||
return !st->has_etc2;
|
||||
|
||||
if (_mesa_is_format_astc_2d(format))
|
||||
return !st->has_astc_2d_ldr;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -337,14 +341,20 @@ st_UnmapTextureImage(struct gl_context *ctx,
|
||||
itransfer->temp_data,
|
||||
itransfer->temp_stride,
|
||||
transfer->box.width, transfer->box.height);
|
||||
}
|
||||
else {
|
||||
} else if (_mesa_is_format_etc2(texImage->TexFormat)) {
|
||||
bool bgra = stImage->pt->format == PIPE_FORMAT_B8G8R8A8_SRGB;
|
||||
_mesa_unpack_etc2_format(itransfer->map, transfer->stride,
|
||||
itransfer->temp_data, itransfer->temp_stride,
|
||||
transfer->box.width, transfer->box.height,
|
||||
texImage->TexFormat,
|
||||
bgra);
|
||||
} else if (_mesa_is_format_astc_2d(texImage->TexFormat)) {
|
||||
_mesa_unpack_astc_2d_ldr(itransfer->map, transfer->stride,
|
||||
itransfer->temp_data, itransfer->temp_stride,
|
||||
transfer->box.width, transfer->box.height,
|
||||
texImage->TexFormat);
|
||||
} else {
|
||||
unreachable("unexpected format for a compressed format fallback");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1415,6 +1425,7 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims,
|
||||
dst_level = texImage->TexObject->MinLevel + texImage->Level;
|
||||
|
||||
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
|
||||
!_mesa_is_format_astc_2d(texImage->TexFormat) &&
|
||||
texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
|
||||
|
||||
if (!dst)
|
||||
@@ -1875,6 +1886,7 @@ st_GetTexSubImage(struct gl_context * ctx,
|
||||
boolean done = FALSE;
|
||||
|
||||
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
|
||||
!_mesa_is_format_astc_2d(texImage->TexFormat) &&
|
||||
texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
|
||||
|
||||
st_flush_bitmap_cache(st);
|
||||
@@ -2392,6 +2404,7 @@ st_CopyTexSubImage(struct gl_context *ctx, GLuint dims,
|
||||
st_invalidate_readpix_cache(st);
|
||||
|
||||
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
|
||||
!_mesa_is_format_astc_2d(texImage->TexFormat) &&
|
||||
texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
|
||||
|
||||
if (!strb || !strb->surface || !stImage->pt) {
|
||||
|
@@ -438,6 +438,9 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
|
||||
st->has_etc2 = screen->is_format_supported(screen, PIPE_FORMAT_ETC2_RGB8,
|
||||
PIPE_TEXTURE_2D, 0,
|
||||
PIPE_BIND_SAMPLER_VIEW);
|
||||
st->has_astc_2d_ldr =
|
||||
screen->is_format_supported(screen, PIPE_FORMAT_ASTC_4x4_SRGB,
|
||||
PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
|
||||
st->prefer_blit_based_texture_transfer = screen->get_param(screen,
|
||||
PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER);
|
||||
st->force_persample_in_shader =
|
||||
|
@@ -120,6 +120,7 @@ struct st_context
|
||||
boolean has_shader_model3;
|
||||
boolean has_etc1;
|
||||
boolean has_etc2;
|
||||
boolean has_astc_2d_ldr;
|
||||
boolean prefer_blit_based_texture_transfer;
|
||||
boolean force_persample_in_shader;
|
||||
boolean has_shareable_shaders;
|
||||
|
@@ -802,6 +802,11 @@ void st_init_extensions(struct pipe_screen *screen,
|
||||
PIPE_FORMAT_ASTC_12x10_SRGB,
|
||||
PIPE_FORMAT_ASTC_12x12_SRGB } },
|
||||
|
||||
/* ASTC software fallback support. */
|
||||
{ { o(KHR_texture_compression_astc_ldr) },
|
||||
{ PIPE_FORMAT_R8G8B8A8_UNORM,
|
||||
PIPE_FORMAT_R8G8B8A8_SRGB } },
|
||||
|
||||
{ { o(EXT_texture_shared_exponent) },
|
||||
{ PIPE_FORMAT_R9G9B9E5_FLOAT } },
|
||||
|
||||
|
@@ -487,61 +487,117 @@ st_mesa_format_to_pipe_format(const struct st_context *st,
|
||||
has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
|
||||
case MESA_FORMAT_RGBA_ASTC_4x4:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_4x4;
|
||||
case MESA_FORMAT_RGBA_ASTC_5x4:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_5x4;
|
||||
case MESA_FORMAT_RGBA_ASTC_5x5:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_5x5;
|
||||
case MESA_FORMAT_RGBA_ASTC_6x5:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_6x5;
|
||||
case MESA_FORMAT_RGBA_ASTC_6x6:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_6x6;
|
||||
case MESA_FORMAT_RGBA_ASTC_8x5:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_8x5;
|
||||
case MESA_FORMAT_RGBA_ASTC_8x6:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_8x6;
|
||||
case MESA_FORMAT_RGBA_ASTC_8x8:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_8x8;
|
||||
case MESA_FORMAT_RGBA_ASTC_10x5:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_10x5;
|
||||
case MESA_FORMAT_RGBA_ASTC_10x6:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_10x6;
|
||||
case MESA_FORMAT_RGBA_ASTC_10x8:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_10x8;
|
||||
case MESA_FORMAT_RGBA_ASTC_10x10:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_10x10;
|
||||
case MESA_FORMAT_RGBA_ASTC_12x10:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_12x10;
|
||||
case MESA_FORMAT_RGBA_ASTC_12x12:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return PIPE_FORMAT_ASTC_12x12;
|
||||
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_4x4_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_5x4_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_5x5_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_6x5_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_6x6_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_8x5_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_8x6_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_8x8_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_10x5_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_10x6_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_10x8_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_10x10_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_12x10_SRGB;
|
||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12:
|
||||
if (!st->has_astc_2d_ldr)
|
||||
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||
return PIPE_FORMAT_ASTC_12x12_SRGB;
|
||||
|
||||
default:
|
||||
|
Reference in New Issue
Block a user