X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_format.c;h=febde1a5e97bcbaedc418e25e11d9691e11f0687;hb=45f4dab62bd7c4daf9d9fc357f4ed1275445f13a;hp=418f5342025c7758fb89fc6c1556eb2b6d04c1ec;hpb=8adf813f83b9f54e3c9958cc7c7a485e62222e2e;p=mesa.git diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c index 418f5342025..febde1a5e97 100644 --- a/src/mesa/state_tracker/st_format.c +++ b/src/mesa/state_tracker/st_format.c @@ -52,6 +52,7 @@ #include "st_cb_texture.h" #include "st_context.h" #include "st_format.h" +#include "st_texture.h" /** @@ -61,6 +62,12 @@ enum pipe_format st_mesa_format_to_pipe_format(const struct st_context *st, mesa_format mesaFormat) { + struct pipe_screen *screen = st->pipe->screen; + bool has_bgra_srgb = screen->is_format_supported(screen, + PIPE_FORMAT_B8G8R8A8_SRGB, + PIPE_TEXTURE_2D, 0, 0, + PIPE_BIND_SAMPLER_VIEW); + switch (mesaFormat) { case MESA_FORMAT_A8B8G8R8_UNORM: return PIPE_FORMAT_ABGR8888_UNORM; @@ -162,6 +169,8 @@ st_mesa_format_to_pipe_format(const struct st_context *st, return PIPE_FORMAT_AL88_SRGB; case MESA_FORMAT_L_SRGB8: return PIPE_FORMAT_L8_SRGB; + case MESA_FORMAT_R_SRGB8: + return PIPE_FORMAT_R8_SRGB; case MESA_FORMAT_BGR_SRGB8: return PIPE_FORMAT_R8G8B8_SRGB; case MESA_FORMAT_A8B8G8R8_SRGB: @@ -458,11 +467,13 @@ st_mesa_format_to_pipe_format(const struct st_context *st, case MESA_FORMAT_ETC2_RGB8: return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8 : PIPE_FORMAT_R8G8B8A8_UNORM; case MESA_FORMAT_ETC2_SRGB8: - return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8 : PIPE_FORMAT_B8G8R8A8_SRGB; + return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8 : + has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB; case MESA_FORMAT_ETC2_RGBA8_EAC: return st->has_etc2 ? PIPE_FORMAT_ETC2_RGBA8 : PIPE_FORMAT_R8G8B8A8_UNORM; case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC: - return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGBA8 : PIPE_FORMAT_B8G8R8A8_SRGB; + return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGBA8 : + has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB; case MESA_FORMAT_ETC2_R11_EAC: return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_UNORM : PIPE_FORMAT_R16_UNORM; case MESA_FORMAT_ETC2_RG11_EAC: @@ -474,64 +485,121 @@ st_mesa_format_to_pipe_format(const struct st_context *st, case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1: return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8A1 : PIPE_FORMAT_R8G8B8A8_UNORM; case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1: - return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8A1 : PIPE_FORMAT_B8G8R8A8_SRGB; + return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8A1 : + 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: @@ -653,6 +721,8 @@ st_pipe_format_to_mesa_format(enum pipe_format format) return MESA_FORMAT_A8L8_SRGB; case PIPE_FORMAT_L8_SRGB: return MESA_FORMAT_L_SRGB8; + case PIPE_FORMAT_R8_SRGB: + return MESA_FORMAT_R_SRGB8; case PIPE_FORMAT_R8G8B8_SRGB: return MESA_FORMAT_BGR_SRGB8; case PIPE_FORMAT_ABGR8888_SRGB: @@ -1037,10 +1107,7 @@ test_format_conversion(struct st_context *st) for (i = 1; i < MESA_FORMAT_COUNT; i++) { enum pipe_format pf; - /* ETC formats are translated differently, skip them. */ - if (_mesa_is_format_etc2(i)) - continue; - if (i == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1) + if (st_compressed_format_fallback(st, i)) continue; pf = st_mesa_format_to_pipe_format(st, i); @@ -1052,12 +1119,8 @@ test_format_conversion(struct st_context *st) /* Test all Gallium formats */ for (i = 1; i < PIPE_FORMAT_COUNT; i++) { - /* ETC formats are translated differently, skip them. */ - if (i == PIPE_FORMAT_ETC1_RGB8 && !st->has_etc1) - continue; - mesa_format mf = st_pipe_format_to_mesa_format(i); - if (_mesa_is_format_etc2(mf) && !st->has_etc2) + if (st_compressed_format_fallback(st, mf)) continue; if (mf != MESA_FORMAT_NONE) { @@ -1364,6 +1427,10 @@ static const struct format_mapping format_map[] = { 0 }, { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS } }, + { + { GL_SR8_EXT, 0 }, + { PIPE_FORMAT_R8_SRGB, 0 } + }, /* 16-bit float formats */ { @@ -1994,13 +2061,15 @@ find_supported_format(struct pipe_screen *screen, const enum pipe_format formats[], enum pipe_texture_target target, unsigned sample_count, + unsigned storage_sample_count, unsigned bindings, boolean allow_dxt) { uint i; for (i = 0; formats[i]; i++) { if (screen->is_format_supported(screen, formats[i], target, - sample_count, bindings)) { + sample_count, storage_sample_count, + bindings)) { if (!allow_dxt && util_format_is_s3tc(formats[i])) { /* we can't return a dxt format, continue searching */ continue; @@ -2105,6 +2174,7 @@ enum pipe_format st_choose_format(struct st_context *st, GLenum internalFormat, GLenum format, GLenum type, enum pipe_texture_target target, unsigned sample_count, + unsigned storage_sample_count, unsigned bindings, boolean allow_dxt) { struct pipe_screen *screen = st->pipe->screen; @@ -2133,8 +2203,8 @@ st_choose_format(struct st_context *st, GLenum internalFormat, /* search for exact matches */ pf = find_exact_format(internalFormat, format, type); if (pf != PIPE_FORMAT_NONE && - screen->is_format_supported(screen, pf, - target, sample_count, bindings)) { + screen->is_format_supported(screen, pf, target, sample_count, + storage_sample_count, bindings)) { goto success; } @@ -2160,7 +2230,8 @@ st_choose_format(struct st_context *st, GLenum internalFormat, * which is supported by the driver. */ pf = find_supported_format(screen, mapping->pipeFormats, - target, sample_count, bindings, + target, sample_count, + storage_sample_count, bindings, allow_dxt); goto success; } @@ -2188,7 +2259,8 @@ success: */ enum pipe_format st_choose_renderbuffer_format(struct st_context *st, - GLenum internalFormat, unsigned sample_count) + GLenum internalFormat, unsigned sample_count, + unsigned storage_sample_count) { unsigned bindings; if (_mesa_is_depth_or_stencil_format(internalFormat)) @@ -2196,7 +2268,8 @@ st_choose_renderbuffer_format(struct st_context *st, else bindings = PIPE_BIND_RENDER_TARGET; return st_choose_format(st, internalFormat, GL_NONE, GL_NONE, - PIPE_TEXTURE_2D, sample_count, bindings, FALSE); + PIPE_TEXTURE_2D, sample_count, + storage_sample_count, bindings, FALSE); } @@ -2231,8 +2304,8 @@ st_choose_matching_format(struct st_context *st, unsigned bind, st_mesa_format_to_pipe_format(st, mesa_format); if (format && - screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, - bind)) { + screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, + 0, 0, bind)) { return format; } /* It's unlikely to find 2 matching Mesa formats. */ @@ -2283,6 +2356,8 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target, bindings |= PIPE_BIND_DEPTH_STENCIL; else if (is_renderbuffer || internalFormat == 3 || internalFormat == 4 || internalFormat == GL_RGB || internalFormat == GL_RGBA || + internalFormat == GL_RGBA2 || + internalFormat == GL_RGB4 || internalFormat == GL_RGBA4 || internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 || internalFormat == GL_BGRA || internalFormat == GL_RGB16F || @@ -2328,20 +2403,18 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target, } pFormat = st_choose_format(st, internalFormat, format, type, - pTarget, 0, bindings, GL_TRUE); + pTarget, 0, 0, bindings, GL_TRUE); if (pFormat == PIPE_FORMAT_NONE && !is_renderbuffer) { /* try choosing format again, this time without render target bindings */ pFormat = st_choose_format(st, internalFormat, format, type, - pTarget, 0, PIPE_BIND_SAMPLER_VIEW, + pTarget, 0, 0, PIPE_BIND_SAMPLER_VIEW, GL_TRUE); } if (pFormat == PIPE_FORMAT_NONE) { - /* lie about using etc1/etc2 natively if we do decoding tricks */ mFormat = _mesa_glenum_to_compressed_format(internalFormat); - if ((mFormat == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1) || - (_mesa_is_format_etc2(mFormat) && !st->has_etc2)) + if (st_compressed_format_fallback(st, mFormat)) return mFormat; /* no luck at all */ @@ -2386,14 +2459,14 @@ st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target, /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear * formats. */ - if (!ctx->Extensions.EXT_framebuffer_sRGB) { + if (!ctx->Extensions.EXT_sRGB) { internalFormat = _mesa_get_linear_internalformat(internalFormat); } /* Set sample counts in descending order. */ for (i = 16; i > 1; i--) { format = st_choose_format(st, internalFormat, GL_NONE, GL_NONE, - PIPE_TEXTURE_2D, i, bind, FALSE); + PIPE_TEXTURE_2D, i, i, bind, FALSE); if (format != PIPE_FORMAT_NONE) { samples[num_sample_counts++] = i; @@ -2452,7 +2525,7 @@ st_QueryInternalFormat(struct gl_context *ctx, GLenum target, internalFormat, GL_NONE, GL_NONE, - PIPE_TEXTURE_2D, 1, + PIPE_TEXTURE_2D, 0, 0, bindings, FALSE); if (pformat) params[0] = internalFormat;