summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2018-02-13 04:25:29 +0100
committerMarek Olšák <[email protected]>2018-07-31 18:09:57 -0400
commited8b4ed6c4c0f2d318e21ed964bb18d0e5a3b800 (patch)
treedaacfe4d14b1236fd57004fdefbab51d2ca8cbc1 /src/mesa/state_tracker
parent5fe52044efec0506eb2ce05ccdc9e5ce53941538 (diff)
st/mesa: implement ASTC 2D LDR fallback for all drivers
Tested-by: Mike Lothian <[email protected]> Tested-By: Gert Wollny<[email protected]> Tested-by: Dieter Nützel <[email protected]> Reviewed-By: Gert Wollny <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_cb_texture.c17
-rw-r--r--src/mesa/state_tracker/st_context.c3
-rw-r--r--src/mesa/state_tracker/st_context.h1
-rw-r--r--src/mesa/state_tracker/st_extensions.c5
-rw-r--r--src/mesa/state_tracker/st_format.c56
5 files changed, 80 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 80eb171dfd8..56d8c411472 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -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) {
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index b7330acfcca..c124793fa40 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -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 =
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index a4d52b40ae4..6b1b5633ecc 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -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;
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index aaf1aa10ac6..2ec47581c50 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -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 } },
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index 45513e8683e..afe810f4d15 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -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: