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/pbo.h"
|
||||||
#include "main/pixeltransfer.h"
|
#include "main/pixeltransfer.h"
|
||||||
#include "main/texcompress.h"
|
#include "main/texcompress.h"
|
||||||
|
#include "main/texcompress_astc.h"
|
||||||
#include "main/texcompress_etc.h"
|
#include "main/texcompress_etc.h"
|
||||||
#include "main/texgetimage.h"
|
#include "main/texgetimage.h"
|
||||||
#include "main/teximage.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))
|
if (_mesa_is_format_etc2(format))
|
||||||
return !st->has_etc2;
|
return !st->has_etc2;
|
||||||
|
|
||||||
|
if (_mesa_is_format_astc_2d(format))
|
||||||
|
return !st->has_astc_2d_ldr;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,14 +341,20 @@ st_UnmapTextureImage(struct gl_context *ctx,
|
|||||||
itransfer->temp_data,
|
itransfer->temp_data,
|
||||||
itransfer->temp_stride,
|
itransfer->temp_stride,
|
||||||
transfer->box.width, transfer->box.height);
|
transfer->box.width, transfer->box.height);
|
||||||
}
|
} else if (_mesa_is_format_etc2(texImage->TexFormat)) {
|
||||||
else {
|
|
||||||
bool bgra = stImage->pt->format == PIPE_FORMAT_B8G8R8A8_SRGB;
|
bool bgra = stImage->pt->format == PIPE_FORMAT_B8G8R8A8_SRGB;
|
||||||
_mesa_unpack_etc2_format(itransfer->map, transfer->stride,
|
_mesa_unpack_etc2_format(itransfer->map, transfer->stride,
|
||||||
itransfer->temp_data, itransfer->temp_stride,
|
itransfer->temp_data, itransfer->temp_stride,
|
||||||
transfer->box.width, transfer->box.height,
|
transfer->box.width, transfer->box.height,
|
||||||
texImage->TexFormat,
|
texImage->TexFormat,
|
||||||
bgra);
|
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;
|
dst_level = texImage->TexObject->MinLevel + texImage->Level;
|
||||||
|
|
||||||
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
|
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
|
||||||
|
!_mesa_is_format_astc_2d(texImage->TexFormat) &&
|
||||||
texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
|
texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
|
||||||
|
|
||||||
if (!dst)
|
if (!dst)
|
||||||
@@ -1875,6 +1886,7 @@ st_GetTexSubImage(struct gl_context * ctx,
|
|||||||
boolean done = FALSE;
|
boolean done = FALSE;
|
||||||
|
|
||||||
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
|
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
|
||||||
|
!_mesa_is_format_astc_2d(texImage->TexFormat) &&
|
||||||
texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
|
texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
|
||||||
|
|
||||||
st_flush_bitmap_cache(st);
|
st_flush_bitmap_cache(st);
|
||||||
@@ -2392,6 +2404,7 @@ st_CopyTexSubImage(struct gl_context *ctx, GLuint dims,
|
|||||||
st_invalidate_readpix_cache(st);
|
st_invalidate_readpix_cache(st);
|
||||||
|
|
||||||
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
|
assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
|
||||||
|
!_mesa_is_format_astc_2d(texImage->TexFormat) &&
|
||||||
texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
|
texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
|
||||||
|
|
||||||
if (!strb || !strb->surface || !stImage->pt) {
|
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,
|
st->has_etc2 = screen->is_format_supported(screen, PIPE_FORMAT_ETC2_RGB8,
|
||||||
PIPE_TEXTURE_2D, 0,
|
PIPE_TEXTURE_2D, 0,
|
||||||
PIPE_BIND_SAMPLER_VIEW);
|
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,
|
st->prefer_blit_based_texture_transfer = screen->get_param(screen,
|
||||||
PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER);
|
PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER);
|
||||||
st->force_persample_in_shader =
|
st->force_persample_in_shader =
|
||||||
|
@@ -120,6 +120,7 @@ struct st_context
|
|||||||
boolean has_shader_model3;
|
boolean has_shader_model3;
|
||||||
boolean has_etc1;
|
boolean has_etc1;
|
||||||
boolean has_etc2;
|
boolean has_etc2;
|
||||||
|
boolean has_astc_2d_ldr;
|
||||||
boolean prefer_blit_based_texture_transfer;
|
boolean prefer_blit_based_texture_transfer;
|
||||||
boolean force_persample_in_shader;
|
boolean force_persample_in_shader;
|
||||||
boolean has_shareable_shaders;
|
boolean has_shareable_shaders;
|
||||||
|
@@ -802,6 +802,11 @@ void st_init_extensions(struct pipe_screen *screen,
|
|||||||
PIPE_FORMAT_ASTC_12x10_SRGB,
|
PIPE_FORMAT_ASTC_12x10_SRGB,
|
||||||
PIPE_FORMAT_ASTC_12x12_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) },
|
{ { o(EXT_texture_shared_exponent) },
|
||||||
{ PIPE_FORMAT_R9G9B9E5_FLOAT } },
|
{ 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;
|
has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
|
|
||||||
case MESA_FORMAT_RGBA_ASTC_4x4:
|
case MESA_FORMAT_RGBA_ASTC_4x4:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_4x4;
|
return PIPE_FORMAT_ASTC_4x4;
|
||||||
case MESA_FORMAT_RGBA_ASTC_5x4:
|
case MESA_FORMAT_RGBA_ASTC_5x4:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_5x4;
|
return PIPE_FORMAT_ASTC_5x4;
|
||||||
case MESA_FORMAT_RGBA_ASTC_5x5:
|
case MESA_FORMAT_RGBA_ASTC_5x5:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_5x5;
|
return PIPE_FORMAT_ASTC_5x5;
|
||||||
case MESA_FORMAT_RGBA_ASTC_6x5:
|
case MESA_FORMAT_RGBA_ASTC_6x5:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_6x5;
|
return PIPE_FORMAT_ASTC_6x5;
|
||||||
case MESA_FORMAT_RGBA_ASTC_6x6:
|
case MESA_FORMAT_RGBA_ASTC_6x6:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_6x6;
|
return PIPE_FORMAT_ASTC_6x6;
|
||||||
case MESA_FORMAT_RGBA_ASTC_8x5:
|
case MESA_FORMAT_RGBA_ASTC_8x5:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_8x5;
|
return PIPE_FORMAT_ASTC_8x5;
|
||||||
case MESA_FORMAT_RGBA_ASTC_8x6:
|
case MESA_FORMAT_RGBA_ASTC_8x6:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_8x6;
|
return PIPE_FORMAT_ASTC_8x6;
|
||||||
case MESA_FORMAT_RGBA_ASTC_8x8:
|
case MESA_FORMAT_RGBA_ASTC_8x8:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_8x8;
|
return PIPE_FORMAT_ASTC_8x8;
|
||||||
case MESA_FORMAT_RGBA_ASTC_10x5:
|
case MESA_FORMAT_RGBA_ASTC_10x5:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_10x5;
|
return PIPE_FORMAT_ASTC_10x5;
|
||||||
case MESA_FORMAT_RGBA_ASTC_10x6:
|
case MESA_FORMAT_RGBA_ASTC_10x6:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_10x6;
|
return PIPE_FORMAT_ASTC_10x6;
|
||||||
case MESA_FORMAT_RGBA_ASTC_10x8:
|
case MESA_FORMAT_RGBA_ASTC_10x8:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_10x8;
|
return PIPE_FORMAT_ASTC_10x8;
|
||||||
case MESA_FORMAT_RGBA_ASTC_10x10:
|
case MESA_FORMAT_RGBA_ASTC_10x10:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_10x10;
|
return PIPE_FORMAT_ASTC_10x10;
|
||||||
case MESA_FORMAT_RGBA_ASTC_12x10:
|
case MESA_FORMAT_RGBA_ASTC_12x10:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_12x10;
|
return PIPE_FORMAT_ASTC_12x10;
|
||||||
case MESA_FORMAT_RGBA_ASTC_12x12:
|
case MESA_FORMAT_RGBA_ASTC_12x12:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
return PIPE_FORMAT_ASTC_12x12;
|
return PIPE_FORMAT_ASTC_12x12;
|
||||||
|
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_4x4_SRGB;
|
return PIPE_FORMAT_ASTC_4x4_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_5x4_SRGB;
|
return PIPE_FORMAT_ASTC_5x4_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_5x5_SRGB;
|
return PIPE_FORMAT_ASTC_5x5_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_6x5_SRGB;
|
return PIPE_FORMAT_ASTC_6x5_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_6x6_SRGB;
|
return PIPE_FORMAT_ASTC_6x6_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_8x5_SRGB;
|
return PIPE_FORMAT_ASTC_8x5_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_8x6_SRGB;
|
return PIPE_FORMAT_ASTC_8x6_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_8x8_SRGB;
|
return PIPE_FORMAT_ASTC_8x8_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_10x5_SRGB;
|
return PIPE_FORMAT_ASTC_10x5_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_10x6_SRGB;
|
return PIPE_FORMAT_ASTC_10x6_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_10x8_SRGB;
|
return PIPE_FORMAT_ASTC_10x8_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_10x10_SRGB;
|
return PIPE_FORMAT_ASTC_10x10_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_12x10_SRGB;
|
return PIPE_FORMAT_ASTC_12x10_SRGB;
|
||||||
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12:
|
case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12:
|
||||||
|
if (!st->has_astc_2d_ldr)
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_SRGB;
|
||||||
return PIPE_FORMAT_ASTC_12x12_SRGB;
|
return PIPE_FORMAT_ASTC_12x12_SRGB;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user