diff options
author | Mark Mueller <MarkKMueller@gmail.com> | 2013-11-21 14:58:34 -0800 |
---|---|---|
committer | Mark Mueller <MarkKMueller@gmail.com> | 2014-01-13 09:44:30 -0800 |
commit | e2978ead843153693d8a3ab33fce1ca8bebace5e (patch) | |
tree | defc6acc56f1b6c9733bc71ff112466f296bc8bc | |
parent | e6ed8b3014d0e4f52319a5dc8f05fe789bc310fc (diff) |
In process with cleaning up of format handling
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp.cpp | 21 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 39 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp_clear.cpp | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 18 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_defines.h | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_state.h | 19 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_surface_formats.c | 919 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 34 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 24 |
10 files changed, 713 insertions, 370 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_blorp.cpp b/src/mesa/drivers/dri/i965/brw_blorp.cpp index c07104f8ce..0b2e81e76d 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp.cpp @@ -83,15 +83,25 @@ brw_blorp_surface_info::set(struct brw_context *brw, brw_blorp_mip_info::set(mt, level, layer); this->num_samples = mt->num_samples; this->array_spacing_lod0 = mt->array_spacing_lod0; - this->map_stencil_as_y_tiled = false; + /* The miptree is a W-tiled stencil buffer. Surface states can't be set + * up for W tiling, so we'll need to use Y tiling and have the WM + * program swizzle the coordinates. + */ + this->map_stencil_as_y_tiled = mt->format == MESA_FORMAT_S8; this->msaa_layout = mt->msaa_layout; + gl_format linear_format = _mesa_get_srgb_format_linear(mt->format); + if (is_render_target) { + /* set up for a render target */ + brw_format_for_mesa_format(linear_format, &this->process_format_flags, &this->brw_surfaceformat, 0); + } else { + /* set up for a sample target */ + brw_format_for_mesa_format(linear_format, &this->process_format_flags, 0, &this->brw_surfaceformat); + } + +#if 0 switch (mt->format) { case MESA_FORMAT_S8: - /* The miptree is a W-tiled stencil buffer. Surface states can't be set - * up for W tiling, so we'll need to use Y tiling and have the WM - * program swizzle the coordinates. - */ this->map_stencil_as_y_tiled = true; this->brw_surfaceformat = BRW_SURFACEFORMAT_R8_UNORM; break; @@ -125,6 +135,7 @@ brw_blorp_surface_info::set(struct brw_context *brw, break; } } +#endif } diff --git a/src/mesa/drivers/dri/i965/brw_blorp.h b/src/mesa/drivers/dri/i965/brw_blorp.h index be367b7559..1bc3378767 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp.h +++ b/src/mesa/drivers/dri/i965/brw_blorp.h @@ -158,7 +158,7 @@ public: * Format that should be used when setting up the surface state for this * surface. Should correspond to one of the BRW_SURFACEFORMAT_* enums. */ - uint32_t brw_surfaceformat; + BRW_SURFACE brw_surfaceformat; blorp_process_format process_format_flags; /** diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp index b2c57bba4b..0b5fe76941 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp @@ -406,9 +406,9 @@ brw_blorp_GPUcopytexsubimage(struct brw_context *brw, /* Come up with a match to the source format for the texture cache */ gl_format cacheTexFormat = _mesa_choose_cached_tex_format(&brw->ctx, format, type); -// _mesa_debug(&brw->ctx, "%s: Cache Texture Format: %s, Target Format: %s, Internal Format: %s\n", -// __FUNCTION__, _mesa_get_format_name(cacheTexFormat), _mesa_get_format_name(dst_image->TexFormat), -// _mesa_lookup_enum_by_nr(dst_image->InternalFormat)); + _mesa_debug(&brw->ctx, "%s: Cache Texture Format: %s, Target Format: %s, Internal Format: %s\n", + __FUNCTION__, _mesa_get_format_name(cacheTexFormat), _mesa_get_format_name(dst_image->TexFormat), + _mesa_lookup_enum_by_nr(dst_image->InternalFormat)); if (!brw_blorp_blit_params::test_formats(brw, cacheTexFormat, dst_image->TexFormat, dst_image->InternalFormat)) { return false; @@ -2284,26 +2284,25 @@ brw_blorp_blit_params::test_formats(struct brw_context *brw, /* blorp lies about some formats to placate the GPU. */ blorp_process_format src_process_flags; - const GLint srcFormatTranslated = translate_tex_format(brw, src_format, 0, true, &src_process_flags); - blorp_process_format dst_process_flags; - const GLint dstFormatTranslated = translate_tex_format(brw, dst_format, 0, true, &dst_process_flags); - if ((src_process_flags & supported_mask) || (dst_process_flags & supported_mask)) { - _mesa_debug(ctx, "%s: compatible brw_surface format not found for source or target " - "texture mip tree. Source: %s Target: %s\n", - __FUNCTION__, _mesa_get_format_name(src_format), - _mesa_get_format_name(dst_format)); + BRW_SURFACE sample_format; + translate_tex_format(brw, src_format, 0, &src_process_flags, 0, &sample_format); + if (src_process_flags & not_supported_mask) { + _mesa_debug(ctx, "%s: compatible brw_surface format not found for source " + "texture mip tree. Source: %s\n", + __FUNCTION__, _mesa_get_format_name(src_format)); return false; } - - if (!brw_format_for_render(brw, dstFormatTranslated)) { - _mesa_debug(ctx, "%s: The translated target miptree format is not supported as a render target: %s.\n", - __FUNCTION__, _mesa_get_format_name(dst_format)); + if (!brw_format_for_sampling(brw, sample_format)) { + _mesa_debug(ctx, "%s: The translated source miptree format is not supported for sampling: %s.\n", + __FUNCTION__, _mesa_get_format_name(src_format)); return false; } - if (!brw_format_for_sampling(brw, srcFormatTranslated)) { - _mesa_debug(ctx, "%s: The translated source miptree format is not supported for sampling: %s.\n", - __FUNCTION__, _mesa_get_format_name(src_format)); + BRW_SURFACE render_format; + translate_tex_format(brw, dst_format, 0, 0, &render_format, 0); + if (!brw_format_for_render(brw, render_format)) { + _mesa_debug(ctx, "%s: The translated target miptree format is not supported as a render target: %s.\n", + __FUNCTION__, _mesa_get_format_name(dst_format)); return false; } @@ -2409,8 +2408,8 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw, _mesa_get_srgb_format_linear(src_mt->format) == _mesa_get_srgb_format_linear(dst_mt->format)) { blorp_process_format process_flags; - dst.brw_surfaceformat = brw_format_for_mesa_format(dst_mt->format, &process_flags); - src.brw_surfaceformat = dst.brw_surfaceformat; + brw_format_for_mesa_format(dst_mt->format, &process_flags, + &dst.brw_surfaceformat, &src.brw_surfaceformat); } /* When doing a multisample resolve of a GL_LUMINANCE32F or GL_INTENSITY32F diff --git a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp index c55108a69f..0ebf9c6b82 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp @@ -194,7 +194,8 @@ brw_blorp_clear_params::brw_blorp_clear_params(struct brw_context *brw, /* Override the surface format according to the context's sRGB rules. */ gl_format format = _mesa_get_render_format(ctx, irb->mt->format); - dst.brw_surfaceformat = brw->render_target_format[format]; + blorp_process_format process_format_flags; + brw_format_for_mesa_format(format, &process_format_flags, &dst.brw_surfaceformat, 0); x0 = fb->_Xmin; x1 = fb->_Xmax; diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 6382fb53b8..9d1de215dd 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -41,6 +41,8 @@ #include "main/mtypes.h" #include "brw_structs.h" +#include "brw_defines.h" + #ifdef __cplusplus extern "C" { /* Evil hack for using libdrm in a c++ compiler. */ @@ -192,12 +194,14 @@ typedef enum { swizzle_y = 1 << 5, swizzle_z = 1 << 6, swizzle_w = 1 << 7, - type_convert = 1 << 8, + sample_scale = 1 << 8, + + alpha_blend_render = 1 << 9, + internal_format_en = 1 << 10, + blorp_render_target = 1 << 11, + blorp_sample_target = 1 << 12, - alpha_shadow = 1 << 9, - intensity_shadow = 1 << 10, - luminance_shadow = 1 << 11, - x_shadow = 1 << 12, + x_shadow = 1 << 13, scale_mask = scale_x | scale_y | scale_z | scale_w, scale_xy = scale_x | scale_y, @@ -206,7 +210,7 @@ typedef enum { swizzle_xy = swizzle_x | swizzle_y, swizzle_xyz = swizzle_x | swizzle_y | swizzle_z, swizzle_yzw = swizzle_y | swizzle_z | swizzle_w, - supported_mask = scale_mask | swizzle_mask + not_supported_mask = scale_mask | swizzle_mask | sample_scale } blorp_process_format; #define BRW_NEW_URB_FENCE (1 << BRW_STATE_URB_FENCE) @@ -1469,7 +1473,7 @@ struct brw_context } *state_batch_list; int state_batch_count; - uint32_t render_target_format[MESA_FORMAT_COUNT]; +// uint32_t render_target_format[MESA_FORMAT_COUNT]; bool format_supported_as_render_target[MESA_FORMAT_COUNT]; /* Interpolation modes, one byte per vue slot. diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h index 142b2db967..062d4c99de 100644 --- a/src/mesa/drivers/dri/i965/brw_defines.h +++ b/src/mesa/drivers/dri/i965/brw_defines.h @@ -29,6 +29,8 @@ * Keith Whitwell <keith@tungstengraphics.com> */ +#include <sys/types.h> + #define INTEL_MASK(high, low) (((1<<((high)-(low)+1))-1)<<(low)) /* Using the GNU statement expression extension */ #define SET_FIELD(value, field) \ @@ -487,6 +489,8 @@ #define BRW_SURFACE_FORMAT_SHIFT 18 #define BRW_SURFACE_FORMAT_MASK INTEL_MASK(26, 18) +typedef u_int16_t BRW_SURFACE; + #define BRW_SURFACERETURNFORMAT_FLOAT32 0 #define BRW_SURFACERETURNFORMAT_S1 1 diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index 28db5cf813..f5e1b5ec43 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -186,17 +186,20 @@ void gen4_init_vtable_surface_functions(struct brw_context *brw); uint32_t brw_get_surface_tiling_bits(uint32_t tiling); uint32_t brw_get_surface_num_multisamples(unsigned num_samples); -uint32_t brw_format_for_mesa_format(gl_format mesa_format, blorp_process_format *process_flags); -bool brw_format_for_render(struct brw_context *brw, const unsigned brw_surface_sel); -bool brw_format_for_sampling(struct brw_context *brw, const unsigned brw_surface_sel); +void brw_format_for_mesa_format(gl_format mesa_format, blorp_process_format *process_flags, + BRW_SURFACE *render_target, + BRW_SURFACE *sample_format); +bool brw_format_for_render(struct brw_context *brw, const BRW_SURFACE brw_surface_sel); +bool brw_format_for_sampling(struct brw_context *brw, const BRW_SURFACE brw_surface_sel); GLuint translate_tex_target(GLenum target); -GLuint translate_tex_format(struct brw_context *brw, - gl_format mesa_format, - GLenum srgb_decode, - bool for_render, - blorp_process_format *process_flags); +void translate_tex_format(struct brw_context *brw, + gl_format mesa_format, + GLenum srgb_decode, + blorp_process_format *process_flags, + BRW_SURFACE *render_surface, + BRW_SURFACE *sample_surface); int brw_get_texture_swizzle(const struct gl_context *ctx, const struct gl_texture_object *t); diff --git a/src/mesa/drivers/dri/i965/brw_surface_formats.c b/src/mesa/drivers/dri/i965/brw_surface_formats.c index ee30f73c46..8176c76f8d 100644 --- a/src/mesa/drivers/dri/i965/brw_surface_formats.c +++ b/src/mesa/drivers/dri/i965/brw_surface_formats.c @@ -308,13 +308,13 @@ const struct surface_format_info surface_formats[] = { }; bool -brw_format_for_render(struct brw_context *brw, const unsigned brw_surface_sel) +brw_format_for_render(struct brw_context *brw, const BRW_SURFACE brw_surface_sel) { return (surface_formats[brw_surface_sel].render_target <= brw->gen * 10); } bool -brw_format_for_sampling(struct brw_context *brw, const unsigned brw_surface_sel) +brw_format_for_sampling(struct brw_context *brw, const BRW_SURFACE brw_surface_sel) { return (surface_formats[brw_surface_sel].sampling <= brw->gen * 10); } @@ -323,320 +323,633 @@ brw_format_for_sampling(struct brw_context *brw, const unsigned brw_surface_sel) #undef Y struct format_translator { - u_int16_t brw_format; + BRW_SURFACE brw_render_shadow_format; + BRW_SURFACE brw_sample_shadow_format; blorp_process_format process_flags; }; -uint32_t -brw_format_for_mesa_format(gl_format mesa_format, blorp_process_format *process_flags) +void +brw_format_for_mesa_format(gl_format mesa_format, blorp_process_format *process_flags, + BRW_SURFACE *render_target, BRW_SURFACE *sample_format) { - /* This table is ordered according to the enum ordering in formats.h. We do - * expect that enum to be extended without our explicit initialization - * staying in sync, so we initialize to 0 even though - * BRW_SURFACEFORMAT_R32G32B32A32_FLOAT happens to also be 0. + /* This table is ordered according to the enum ordering in formats.h. gl_formats + * are used to tag both source sampling and destination render targets, but + * the corresponding brw_surface may differ, thus storage is provided for each case, + * as well as flags to indicate any additional processing that may be required by + * blorp, and/or limitiations with some formats. */ static const struct format_translator table[MESA_PRIVATE_FORMAT_COUNT] = { - [MESA_FORMAT_RGBA8888] = {BRW_SURFACEFORMAT_R8G8B8A8_UNORM, swizzle_all}, - [MESA_FORMAT_RGBA8888_REV] = {BRW_SURFACEFORMAT_R8G8B8A8_UNORM, 0}, - [MESA_FORMAT_ARGB8888] = {BRW_SURFACEFORMAT_B8G8R8A8_UNORM, 0}, - [MESA_FORMAT_ARGB8888_REV] = {BRW_SURFACEFORMAT_B8G8R8A8_UNORM, swizzle_all}, - [MESA_FORMAT_RGBX8888] = {BRW_SURFACEFORMAT_R8G8B8X8_UNORM, swizzle_all}, - [MESA_FORMAT_RGBX8888_REV] = {BRW_SURFACEFORMAT_R8G8B8X8_UNORM, 0}, - [MESA_FORMAT_XRGB8888] = {BRW_SURFACEFORMAT_B8G8R8X8_UNORM, 0}, - [MESA_FORMAT_XRGB8888_REV] = {BRW_SURFACEFORMAT_B8G8R8X8_UNORM, swizzle_all}, - [MESA_FORMAT_RGB888] = {BRW_SURFACEFORMAT_R8G8B8_UNORM, swizzle_xyz}, - [MESA_FORMAT_BGR888] = {BRW_SURFACEFORMAT_R8G8B8_UNORM, 0}, - [MESA_FORMAT_RGB565] = {BRW_SURFACEFORMAT_B5G6R5_UNORM, 0}, - [MESA_FORMAT_RGB565_REV] = {BRW_SURFACEFORMAT_B5G6R5_UNORM, swizzle_xyz}, - [MESA_FORMAT_ARGB4444] = {BRW_SURFACEFORMAT_B4G4R4A4_UNORM, 0}, - [MESA_FORMAT_ARGB4444_REV] = {BRW_SURFACEFORMAT_B4G4R4A4_UNORM, swizzle_all}, - [MESA_FORMAT_RGBA5551] = {BRW_SURFACEFORMAT_B5G5R5A1_UNORM, swizzle_all}, - [MESA_FORMAT_ARGB1555] = {BRW_SURFACEFORMAT_B5G5R5A1_UNORM, 0}, - [MESA_FORMAT_ARGB1555_REV] = {BRW_SURFACEFORMAT_B5G5R5A1_UNORM, swizzle_yzw}, - [MESA_FORMAT_AL44] = {BRW_SURFACEFORMAT_L8A8_UNORM, scale_x}, - [MESA_FORMAT_AL88] = {BRW_SURFACEFORMAT_L8A8_UNORM, 0}, - [MESA_FORMAT_AL88_REV] = {BRW_SURFACEFORMAT_L8A8_UNORM, swizzle_xy}, - [MESA_FORMAT_AL1616] = {BRW_SURFACEFORMAT_L16A16_UNORM, 0}, - [MESA_FORMAT_AL1616_REV] = {BRW_SURFACEFORMAT_L16A16_UNORM, swizzle_xy}, - [MESA_FORMAT_RGB332] = {BRW_SURFACEFORMAT_B5G6R5_UNORM, scale_x}, - [MESA_FORMAT_A8] = {BRW_SURFACEFORMAT_A8_UNORM, 0}, - [MESA_FORMAT_A16] = {BRW_SURFACEFORMAT_A16_UNORM, 0}, - [MESA_FORMAT_L8] = {BRW_SURFACEFORMAT_L8_UNORM, 0}, - [MESA_FORMAT_L16] = {BRW_SURFACEFORMAT_L16_UNORM, 0}, - [MESA_FORMAT_I8] = {BRW_SURFACEFORMAT_I8_UNORM, 0}, - [MESA_FORMAT_I16] = {BRW_SURFACEFORMAT_I16_UNORM, 0}, - [MESA_FORMAT_YCBCR_REV] = {BRW_SURFACEFORMAT_YCRCB_NORMAL, 0}, - [MESA_FORMAT_YCBCR] = {BRW_SURFACEFORMAT_YCRCB_SWAPUVY, 0}, - [MESA_FORMAT_R8] = {BRW_SURFACEFORMAT_R8_UNORM, 0}, - [MESA_FORMAT_GR88] = {BRW_SURFACEFORMAT_R8G8_UNORM, 0}, - [MESA_FORMAT_RG88] = {BRW_SURFACEFORMAT_R8G8_UNORM, swizzle_xy}, - [MESA_FORMAT_R16] = {BRW_SURFACEFORMAT_R16_UNORM, 0}, - [MESA_FORMAT_GR1616] = {BRW_SURFACEFORMAT_R16G16_UNORM, 0}, - [MESA_FORMAT_RG1616] = {BRW_SURFACEFORMAT_R16G16_UNORM, swizzle_xy}, - [MESA_FORMAT_ARGB2101010] = {BRW_SURFACEFORMAT_B10G10R10A2_UNORM, 0}, - [MESA_FORMAT_Z24_S8] = {0, swizzle_all}, - [MESA_FORMAT_S8_Z24] = {0, swizzle_all}, - [MESA_FORMAT_Z16] = {0, swizzle_all}, - [MESA_FORMAT_X8_Z24] = {0, swizzle_all}, - [MESA_FORMAT_Z24_X8] = {0, swizzle_all}, - [MESA_FORMAT_Z32] = {0, swizzle_all}, - [MESA_FORMAT_S8] = {0, swizzle_all}, - - [MESA_FORMAT_SRGB8] = {BRW_SURFACEFORMAT_B8G8R8X8_UNORM_SRGB, swizzle_xyz}, - [MESA_FORMAT_SRGBA8] = {BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB, swizzle_all}, - [MESA_FORMAT_SARGB8] = {BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB, 0}, - [MESA_FORMAT_SL8] = {BRW_SURFACEFORMAT_L8_UNORM_SRGB, 0}, - [MESA_FORMAT_SLA8] = {BRW_SURFACEFORMAT_L8A8_UNORM_SRGB, 0}, - [MESA_FORMAT_SRGB_DXT1] = {BRW_SURFACEFORMAT_DXT1_RGB_SRGB, 0}, - [MESA_FORMAT_SRGBA_DXT1] = {BRW_SURFACEFORMAT_BC1_UNORM_SRGB, 0}, - [MESA_FORMAT_SRGBA_DXT3] = {BRW_SURFACEFORMAT_BC2_UNORM_SRGB, 0}, - [MESA_FORMAT_SRGBA_DXT5] = {BRW_SURFACEFORMAT_BC3_UNORM_SRGB, 0}, - - [MESA_FORMAT_RGB_FXT1] = {BRW_SURFACEFORMAT_FXT1, 0}, - [MESA_FORMAT_RGBA_FXT1] = {BRW_SURFACEFORMAT_FXT1, 0}, - [MESA_FORMAT_RGB_DXT1] = {BRW_SURFACEFORMAT_DXT1_RGB, 0}, - [MESA_FORMAT_RGBA_DXT1] = {BRW_SURFACEFORMAT_BC1_UNORM, 0}, - [MESA_FORMAT_RGBA_DXT3] = {BRW_SURFACEFORMAT_BC2_UNORM, 0}, - [MESA_FORMAT_RGBA_DXT5] = {BRW_SURFACEFORMAT_BC3_UNORM, 0}, - - [MESA_FORMAT_RGBA_FLOAT32] = {BRW_SURFACEFORMAT_R32G32B32A32_FLOAT, 0}, - [MESA_FORMAT_RGBA_FLOAT16] = {BRW_SURFACEFORMAT_R16G16B16A16_FLOAT, 0}, - [MESA_FORMAT_RGB_FLOAT32] = {BRW_SURFACEFORMAT_R32G32B32_FLOAT, 0}, - [MESA_FORMAT_RGB_FLOAT16] = {BRW_SURFACEFORMAT_R16G16B16_FLOAT, 0}, - [MESA_FORMAT_ALPHA_FLOAT32] = {BRW_SURFACEFORMAT_A32_FLOAT, 0}, - [MESA_FORMAT_ALPHA_FLOAT16] = {BRW_SURFACEFORMAT_A16_FLOAT, 0}, - [MESA_FORMAT_LUMINANCE_FLOAT32] = {BRW_SURFACEFORMAT_L32_FLOAT, 0}, - [MESA_FORMAT_LUMINANCE_FLOAT16] = {BRW_SURFACEFORMAT_L16_FLOAT, 0}, - [MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = {BRW_SURFACEFORMAT_L32A32_FLOAT, 0}, - [MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = {BRW_SURFACEFORMAT_L16A16_FLOAT, 0}, - [MESA_FORMAT_INTENSITY_FLOAT32] = {BRW_SURFACEFORMAT_I32_FLOAT, 0}, - [MESA_FORMAT_INTENSITY_FLOAT16] = {BRW_SURFACEFORMAT_I16_FLOAT, 0}, - [MESA_FORMAT_R_FLOAT32] = {BRW_SURFACEFORMAT_R32_FLOAT, 0}, - [MESA_FORMAT_R_FLOAT16] = {BRW_SURFACEFORMAT_R16_FLOAT, 0}, - [MESA_FORMAT_RG_FLOAT32] = {BRW_SURFACEFORMAT_R32G32_FLOAT, 0}, - [MESA_FORMAT_RG_FLOAT16] = {BRW_SURFACEFORMAT_R16G16_FLOAT, 0}, - - [MESA_FORMAT_ALPHA_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, type_convert | alpha_shadow}, - [MESA_FORMAT_ALPHA_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, type_convert | alpha_shadow}, - [MESA_FORMAT_ALPHA_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, type_convert | alpha_shadow}, - [MESA_FORMAT_ALPHA_INT8] = {BRW_SURFACEFORMAT_R8_SINT, type_convert | alpha_shadow}, - [MESA_FORMAT_ALPHA_INT16] = {BRW_SURFACEFORMAT_R16_SINT, type_convert | alpha_shadow}, - [MESA_FORMAT_ALPHA_INT32] = {BRW_SURFACEFORMAT_R32_SINT, type_convert | alpha_shadow}, - - [MESA_FORMAT_INTENSITY_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, type_convert | intensity_shadow}, - [MESA_FORMAT_INTENSITY_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, type_convert | intensity_shadow}, - [MESA_FORMAT_INTENSITY_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, type_convert | intensity_shadow}, - [MESA_FORMAT_INTENSITY_INT8] = {BRW_SURFACEFORMAT_R8_SINT, type_convert | intensity_shadow}, - [MESA_FORMAT_INTENSITY_INT16] = {BRW_SURFACEFORMAT_R16_SINT, type_convert | intensity_shadow}, - [MESA_FORMAT_INTENSITY_INT32] = {BRW_SURFACEFORMAT_R32_SINT, type_convert | intensity_shadow}, - - [MESA_FORMAT_LUMINANCE_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, type_convert | luminance_shadow}, - [MESA_FORMAT_LUMINANCE_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, type_convert | luminance_shadow}, - [MESA_FORMAT_LUMINANCE_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, type_convert | luminance_shadow}, - [MESA_FORMAT_LUMINANCE_INT8] = {BRW_SURFACEFORMAT_R8_SINT, type_convert | luminance_shadow}, - [MESA_FORMAT_LUMINANCE_INT16] = {BRW_SURFACEFORMAT_R16_SINT, type_convert | luminance_shadow}, - [MESA_FORMAT_LUMINANCE_INT32] = {BRW_SURFACEFORMAT_R32_SINT, type_convert | luminance_shadow}, - - [MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, type_convert | luminance_shadow | alpha_shadow}, - [MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, type_convert | luminance_shadow | alpha_shadow}, - [MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, type_convert | luminance_shadow | alpha_shadow}, - [MESA_FORMAT_LUMINANCE_ALPHA_INT8] = {BRW_SURFACEFORMAT_R8_SINT, type_convert | luminance_shadow | alpha_shadow}, - [MESA_FORMAT_LUMINANCE_ALPHA_INT16] = {BRW_SURFACEFORMAT_R16_SINT, type_convert | luminance_shadow | alpha_shadow}, - [MESA_FORMAT_LUMINANCE_ALPHA_INT32] = {BRW_SURFACEFORMAT_R32_SINT, type_convert | luminance_shadow | alpha_shadow}, - - [MESA_FORMAT_R_INT8] = {BRW_SURFACEFORMAT_R8_SINT, type_convert}, - [MESA_FORMAT_RG_INT8] = {BRW_SURFACEFORMAT_R8G8_SINT, type_convert}, - [MESA_FORMAT_RGB_INT8] = {BRW_SURFACEFORMAT_R8G8B8_SINT, type_convert}, - [MESA_FORMAT_RGBA_INT8] = {BRW_SURFACEFORMAT_R8G8B8A8_SINT, type_convert}, - [MESA_FORMAT_R_INT16] = {BRW_SURFACEFORMAT_R16_SINT, type_convert}, - [MESA_FORMAT_RG_INT16] = {BRW_SURFACEFORMAT_R16G16_SINT, type_convert}, - [MESA_FORMAT_RGB_INT16] = {BRW_SURFACEFORMAT_R16G16B16_SINT, type_convert}, - [MESA_FORMAT_RGBA_INT16] = {BRW_SURFACEFORMAT_R16G16B16A16_SINT, type_convert}, - [MESA_FORMAT_R_INT32] = {BRW_SURFACEFORMAT_R32_SINT, type_convert}, - [MESA_FORMAT_RG_INT32] = {BRW_SURFACEFORMAT_R32G32_SINT, type_convert}, - [MESA_FORMAT_RGB_INT32] = {BRW_SURFACEFORMAT_R32G32B32_SINT, type_convert}, - [MESA_FORMAT_RGBA_INT32] = {BRW_SURFACEFORMAT_R32G32B32A32_SINT, type_convert}, - - [MESA_FORMAT_R_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, type_convert}, - [MESA_FORMAT_RG_UINT8] = {BRW_SURFACEFORMAT_R8G8_UINT, type_convert}, - [MESA_FORMAT_RGB_UINT8] = {BRW_SURFACEFORMAT_R8G8B8_UINT, type_convert}, - [MESA_FORMAT_RGBA_UINT8] = {BRW_SURFACEFORMAT_R8G8B8A8_UINT, type_convert}, - [MESA_FORMAT_R_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, type_convert}, - [MESA_FORMAT_RG_UINT16] = {BRW_SURFACEFORMAT_R16G16_UINT, type_convert}, - [MESA_FORMAT_RGB_UINT16] = {BRW_SURFACEFORMAT_R16G16B16_UINT, type_convert}, - [MESA_FORMAT_RGBA_UINT16] = {BRW_SURFACEFORMAT_R16G16B16A16_UINT, type_convert}, - [MESA_FORMAT_R_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, type_convert}, - [MESA_FORMAT_RG_UINT32] = {BRW_SURFACEFORMAT_R32G32_UINT, type_convert}, - [MESA_FORMAT_RGB_UINT32] = {BRW_SURFACEFORMAT_R32G32B32_UINT, type_convert}, - [MESA_FORMAT_RGBA_UINT32] = {BRW_SURFACEFORMAT_R32G32B32A32_UINT, type_convert}, - - [MESA_FORMAT_DUDV8] = {BRW_SURFACEFORMAT_R8G8_SNORM, 0}, - [MESA_FORMAT_SIGNED_R8] = {BRW_SURFACEFORMAT_R8_SNORM, 0}, - [MESA_FORMAT_SIGNED_RG88_REV] = {BRW_SURFACEFORMAT_R8G8_SNORM, 0}, - [MESA_FORMAT_SIGNED_RGBX8888] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_RGBA8888] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_RGBA8888_REV] = {BRW_SURFACEFORMAT_R8G8B8A8_SNORM, 0}, - [MESA_FORMAT_SIGNED_R16] = {BRW_SURFACEFORMAT_R16_SNORM, 0}, - [MESA_FORMAT_SIGNED_GR1616] = {BRW_SURFACEFORMAT_R16G16_SNORM, 0}, - [MESA_FORMAT_SIGNED_RGB_16] = {BRW_SURFACEFORMAT_R16G16B16_SNORM, 0}, - [MESA_FORMAT_SIGNED_RGBA_16] = {BRW_SURFACEFORMAT_R16G16B16A16_SNORM, 0}, - [MESA_FORMAT_RGBA_16] = {BRW_SURFACEFORMAT_R16G16B16A16_UNORM, 0}, - - [MESA_FORMAT_RED_RGTC1] = {BRW_SURFACEFORMAT_BC4_UNORM, 0}, - [MESA_FORMAT_SIGNED_RED_RGTC1] = {BRW_SURFACEFORMAT_BC4_SNORM, 0}, - [MESA_FORMAT_RG_RGTC2] = {BRW_SURFACEFORMAT_BC5_UNORM, 0}, - [MESA_FORMAT_SIGNED_RG_RGTC2] = {BRW_SURFACEFORMAT_BC5_SNORM, 0}, - - [MESA_FORMAT_L_LATC1] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_L_LATC1] = {0, swizzle_all}, - [MESA_FORMAT_LA_LATC2] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_LA_LATC2] = {0, swizzle_all}, - - [MESA_FORMAT_ETC1_RGB8] = {BRW_SURFACEFORMAT_ETC1_RGB8, 0}, - [MESA_FORMAT_ETC2_RGB8] = {BRW_SURFACEFORMAT_ETC2_RGB8, 0}, - [MESA_FORMAT_ETC2_SRGB8] = {BRW_SURFACEFORMAT_ETC2_SRGB8, 0}, - [MESA_FORMAT_ETC2_RGBA8_EAC] = {BRW_SURFACEFORMAT_ETC2_EAC_RGBA8, 0}, - [MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC] = {BRW_SURFACEFORMAT_ETC2_EAC_SRGB8_A8, 0}, - [MESA_FORMAT_ETC2_R11_EAC] = {BRW_SURFACEFORMAT_EAC_R11, 0}, - [MESA_FORMAT_ETC2_RG11_EAC] = {BRW_SURFACEFORMAT_EAC_RG11, 0}, - [MESA_FORMAT_ETC2_SIGNED_R11_EAC] = {BRW_SURFACEFORMAT_EAC_SIGNED_R11, 0}, - [MESA_FORMAT_ETC2_SIGNED_RG11_EAC] = {BRW_SURFACEFORMAT_EAC_SIGNED_RG11, 0}, - [MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1] = {BRW_SURFACEFORMAT_ETC2_RGB8_PTA, 0}, - [MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] = {BRW_SURFACEFORMAT_ETC2_SRGB8_PTA, 0}, - - [MESA_FORMAT_SIGNED_A8] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_L8] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_AL88] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_I8] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_A16] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_L16] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_AL1616] = {0, swizzle_all}, - [MESA_FORMAT_SIGNED_I16] = {0, swizzle_all}, - - [MESA_FORMAT_RGB9_E5_FLOAT] = {BRW_SURFACEFORMAT_R9G9B9E5_SHAREDEXP, 0}, - [MESA_FORMAT_R11_G11_B10_FLOAT] = {BRW_SURFACEFORMAT_R11G11B10_FLOAT, 0}, - - [MESA_FORMAT_Z32_FLOAT] = {0, swizzle_all}, - [MESA_FORMAT_Z32_FLOAT_X24S8] = {0, swizzle_all}, - - [MESA_FORMAT_ARGB2101010_UINT] = {BRW_SURFACEFORMAT_B10G10R10A2_UINT, type_convert}, - [MESA_FORMAT_ABGR2101010_UINT] = {BRW_SURFACEFORMAT_R10G10B10A2_UINT, type_convert}, - - [MESA_FORMAT_XRGB4444_UNORM] = {BRW_SURFACEFORMAT_R8G8_UNORM, swizzle_xy | scale_xy}, - [MESA_FORMAT_XRGB1555_UNORM] = {BRW_SURFACEFORMAT_B5G5R5X1_UNORM, 0}, - [MESA_FORMAT_XBGR8888_SNORM] = {BRW_SURFACEFORMAT_R8G8B8A8_SNORM, swizzle_all | x_shadow}, - [MESA_FORMAT_XBGR8888_SRGB] = {BRW_SURFACEFORMAT_R8G8B8X8_UNORM_SRGB, swizzle_all}, - [MESA_FORMAT_XBGR8888_UINT] = {BRW_SURFACEFORMAT_R8G8B8A8_UINT, swizzle_all | x_shadow}, - [MESA_FORMAT_XBGR8888_SINT] = {BRW_SURFACEFORMAT_R8G8B8A8_SINT, swizzle_all | x_shadow}, - [MESA_FORMAT_XRGB2101010_UNORM] = {BRW_SURFACEFORMAT_B10G10R10X2_UNORM, 0}, - [MESA_FORMAT_XBGR16161616_UNORM] = {BRW_SURFACEFORMAT_R16G16B16X16_UNORM, 0}, - [MESA_FORMAT_XBGR16161616_SNORM] = {BRW_SURFACEFORMAT_R16G16B16A16_SNORM, swizzle_all | x_shadow}, - [MESA_FORMAT_XBGR16161616_FLOAT] = {BRW_SURFACEFORMAT_R16G16B16X16_FLOAT, 0}, - [MESA_FORMAT_XBGR16161616_UINT] = {BRW_SURFACEFORMAT_R16G16B16A16_UINT, swizzle_all | x_shadow}, - [MESA_FORMAT_XBGR16161616_SINT] = {BRW_SURFACEFORMAT_R16G16B16A16_SINT, swizzle_all | x_shadow}, - [MESA_FORMAT_XBGR32323232_FLOAT] = {BRW_SURFACEFORMAT_R32G32B32X32_FLOAT, 0}, - [MESA_FORMAT_XBGR32323232_UINT] = {BRW_SURFACEFORMAT_R32G32B32A32_UINT, swizzle_all | x_shadow}, - [MESA_FORMAT_XBGR32323232_SINT] = {BRW_SURFACEFORMAT_R32G32B32A32_SINT, swizzle_all | x_shadow} + [MESA_FORMAT_RGBA8888] = {BRW_SURFACEFORMAT_R8G8B8A8_UNORM, /* shadow render target */ + BRW_SURFACEFORMAT_R8G8B8A8_UNORM, /* shadow sample target */ + swizzle_all}, /* gl_format to brw surface processing */ + [MESA_FORMAT_RGBA8888_REV] = {BRW_SURFACEFORMAT_R8G8B8A8_UNORM, + BRW_SURFACEFORMAT_R8G8B8A8_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_ARGB8888] = {BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_ARGB8888_REV] = {BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + swizzle_all}, + [MESA_FORMAT_RGBX8888] = {BRW_SURFACEFORMAT_R8G8B8X8_UNORM, + BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + alpha_blend_render | swizzle_all}, + [MESA_FORMAT_RGBX8888_REV] = {BRW_SURFACEFORMAT_R8G8B8X8_UNORM, + BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + internal_format_en | alpha_blend_render | blorp_sample_target}, + [MESA_FORMAT_XRGB8888] = {BRW_SURFACEFORMAT_B8G8R8X8_UNORM, + BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + internal_format_en | alpha_blend_render | blorp_sample_target}, + [MESA_FORMAT_XRGB8888_REV] = {BRW_SURFACEFORMAT_B8G8R8X8_UNORM, + BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + alpha_blend_render | swizzle_all}, + [MESA_FORMAT_RGB888] = {BRW_SURFACEFORMAT_R8_UNORM, + 0, + sample_scale | swizzle_xyz}, + [MESA_FORMAT_BGR888] = {BRW_SURFACEFORMAT_R8_UNORM, + 0, + sample_scale}, + [MESA_FORMAT_RGB565] = {BRW_SURFACEFORMAT_B5G6R5_UNORM, + BRW_SURFACEFORMAT_B5G6R5_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_RGB565_REV] = {BRW_SURFACEFORMAT_B5G6R5_UNORM, + BRW_SURFACEFORMAT_B5G6R5_UNORM, + swizzle_xyz}, + [MESA_FORMAT_ARGB4444] = {BRW_SURFACEFORMAT_B4G4R4A4_UNORM, + BRW_SURFACEFORMAT_B4G4R4A4_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_ARGB4444_REV] = {BRW_SURFACEFORMAT_B4G4R4A4_UNORM, + BRW_SURFACEFORMAT_B4G4R4A4_UNORM, + swizzle_all}, + [MESA_FORMAT_RGBA5551] = {BRW_SURFACEFORMAT_B5G5R5A1_UNORM, + BRW_SURFACEFORMAT_B5G5R5A1_UNORM, + swizzle_all}, + [MESA_FORMAT_ARGB1555] = {BRW_SURFACEFORMAT_B5G5R5A1_UNORM, + BRW_SURFACEFORMAT_B5G5R5A1_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_ARGB1555_REV] = {BRW_SURFACEFORMAT_B5G5R5A1_UNORM, + BRW_SURFACEFORMAT_B5G5R5A1_UNORM, + swizzle_yzw}, + [MESA_FORMAT_AL44] = {BRW_SURFACEFORMAT_A8_UNORM, + BRW_SURFACEFORMAT_R8G8_UNORM, + scale_x}, + [MESA_FORMAT_AL88] = {BRW_SURFACEFORMAT_L8A8_UNORM, + BRW_SURFACEFORMAT_R8G8_UNORM, + internal_format_en}, + [MESA_FORMAT_AL88_REV] = {BRW_SURFACEFORMAT_L8A8_UNORM, + BRW_SURFACEFORMAT_R8G8_UNORM, + swizzle_xy}, + [MESA_FORMAT_AL1616] = {BRW_SURFACEFORMAT_L16A16_UNORM, + BRW_SURFACEFORMAT_R16G16_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_AL1616_REV] = {BRW_SURFACEFORMAT_L16A16_UNORM, + BRW_SURFACEFORMAT_R16G16_UNORM, + swizzle_xy}, + [MESA_FORMAT_RGB332] = {BRW_SURFACEFORMAT_R8_UNORM, + BRW_SURFACEFORMAT_B5G6R5_UNORM, + scale_x}, + [MESA_FORMAT_A8] = {BRW_SURFACEFORMAT_A8_UNORM, + BRW_SURFACEFORMAT_A8_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_A16] = {BRW_SURFACEFORMAT_A16_UNORM, + BRW_SURFACEFORMAT_R16_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_L8] = {BRW_SURFACEFORMAT_L8_UNORM, + BRW_SURFACEFORMAT_R8_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_L16] = {BRW_SURFACEFORMAT_L16_UNORM, + BRW_SURFACEFORMAT_R16_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_I8] = {BRW_SURFACEFORMAT_I8_UNORM, + BRW_SURFACEFORMAT_R8_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_I16] = {BRW_SURFACEFORMAT_I16_UNORM, + BRW_SURFACEFORMAT_R16_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_YCBCR_REV] = {BRW_SURFACEFORMAT_YCRCB_NORMAL, + BRW_SURFACEFORMAT_YCRCB_NORMAL, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_YCBCR] = {BRW_SURFACEFORMAT_YCRCB_SWAPUVY, + BRW_SURFACEFORMAT_YCRCB_SWAPUVY, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_R8] = {BRW_SURFACEFORMAT_R8_UNORM, + BRW_SURFACEFORMAT_R8_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_GR88] = {BRW_SURFACEFORMAT_R8G8_UNORM, + BRW_SURFACEFORMAT_R8G8_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_RG88] = {BRW_SURFACEFORMAT_R8G8_UNORM, + BRW_SURFACEFORMAT_R8G8_UNORM, + swizzle_xy}, + [MESA_FORMAT_R16] = {BRW_SURFACEFORMAT_R16_UNORM, + BRW_SURFACEFORMAT_R16_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_GR1616] = {BRW_SURFACEFORMAT_R16G16_UNORM, + BRW_SURFACEFORMAT_R16G16_UNORM, + internal_format_en | blorp_render_target | blorp_sample_target}, + [MESA_FORMAT_RG1616] = {BRW_SURFACEFORMAT_R16G16_UNORM, + BRW_SURFACEFORMAT_R16G16_UNORM, + swizzle_xy}, + [MESA_FORMAT_ARGB2101010] = {BRW_SURFACEFORMAT_B10G10R10A2_UNORM, + 0, + internal_format_en}, + [MESA_FORMAT_Z24_S8] = {BRW_SURFACEFORMAT_I24X8_UNORM, + BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + swizzle_all}, + [MESA_FORMAT_S8_Z24] = {BRW_SURFACEFORMAT_I24X8_UNORM, + BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + internal_format_en}, + [MESA_FORMAT_Z16] = {BRW_SURFACEFORMAT_I16_UNORM, + BRW_SURFACEFORMAT_R16_UNORM, + 0}, + [MESA_FORMAT_X8_Z24] = {BRW_SURFACEFORMAT_I24X8_UNORM, + BRW_SURFACEFORMAT_B8G8R8A8_UNORM, + internal_format_en}, + [MESA_FORMAT_Z24_X8] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_Z32] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_S8] = {BRW_SURFACEFORMAT_R8_UNORM, + BRW_SURFACEFORMAT_R8_UNORM, + 0}, + + [MESA_FORMAT_SRGB8] = {BRW_SURFACEFORMAT_B8G8R8X8_UNORM_SRGB, + 0, + swizzle_xyz}, + [MESA_FORMAT_SRGBA8] = {BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB, + 0, + swizzle_all}, + [MESA_FORMAT_SARGB8] = {BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB, + 0, + internal_format_en}, + [MESA_FORMAT_SL8] = {BRW_SURFACEFORMAT_L8_UNORM_SRGB, + 0, + internal_format_en}, + [MESA_FORMAT_SLA8] = {BRW_SURFACEFORMAT_L8A8_UNORM_SRGB, + 0, + internal_format_en}, + [MESA_FORMAT_SRGB_DXT1] = {BRW_SURFACEFORMAT_DXT1_RGB_SRGB, + 0, + internal_format_en}, + [MESA_FORMAT_SRGBA_DXT1] = {BRW_SURFACEFORMAT_BC1_UNORM_SRGB, + 0, + internal_format_en}, + [MESA_FORMAT_SRGBA_DXT3] = {BRW_SURFACEFORMAT_BC2_UNORM_SRGB, + 0, + internal_format_en}, + [MESA_FORMAT_SRGBA_DXT5] = {BRW_SURFACEFORMAT_BC3_UNORM_SRGB, + 0, + internal_format_en}, + + [MESA_FORMAT_RGB_FXT1] = {BRW_SURFACEFORMAT_FXT1, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_FXT1] = {BRW_SURFACEFORMAT_FXT1, + 0, + internal_format_en}, + [MESA_FORMAT_RGB_DXT1] = {BRW_SURFACEFORMAT_DXT1_RGB, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_DXT1] = {BRW_SURFACEFORMAT_BC1_UNORM, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_DXT3] = {BRW_SURFACEFORMAT_BC2_UNORM, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_DXT5] = {BRW_SURFACEFORMAT_BC3_UNORM, + 0, + internal_format_en}, + + [MESA_FORMAT_RGBA_FLOAT32] = {BRW_SURFACEFORMAT_R32G32B32A32_FLOAT, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_FLOAT16] = {BRW_SURFACEFORMAT_R16G16B16A16_FLOAT, + 0, + internal_format_en}, + [MESA_FORMAT_RGB_FLOAT32] = {BRW_SURFACEFORMAT_R32G32B32_FLOAT, + 0, + internal_format_en}, + [MESA_FORMAT_RGB_FLOAT16] = {BRW_SURFACEFORMAT_R16G16B16_FLOAT, + 0, + internal_format_en}, + [MESA_FORMAT_ALPHA_FLOAT32] = {BRW_SURFACEFORMAT_A32_FLOAT, + BRW_SURFACEFORMAT_R32_FLOAT, + internal_format_en}, + [MESA_FORMAT_ALPHA_FLOAT16] = {BRW_SURFACEFORMAT_A16_FLOAT, + 0, + internal_format_en}, + [MESA_FORMAT_LUMINANCE_FLOAT32] = {BRW_SURFACEFORMAT_L32_FLOAT, + BRW_SURFACEFORMAT_R32_FLOAT, + internal_format_en}, + [MESA_FORMAT_LUMINANCE_FLOAT16] = {BRW_SURFACEFORMAT_L16_FLOAT, + BRW_SURFACEFORMAT_R16_FLOAT, + internal_format_en}, + [MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = {BRW_SURFACEFORMAT_L32A32_FLOAT, + 0, + internal_format_en}, + [MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = {BRW_SURFACEFORMAT_L16A16_FLOAT, + 0, + internal_format_en}, + [MESA_FORMAT_INTENSITY_FLOAT32] = {BRW_SURFACEFORMAT_I32_FLOAT, + BRW_SURFACEFORMAT_R32_FLOAT, + internal_format_en}, + [MESA_FORMAT_INTENSITY_FLOAT16] = {BRW_SURFACEFORMAT_I16_FLOAT, + BRW_SURFACEFORMAT_R16_FLOAT, + internal_format_en}, + [MESA_FORMAT_R_FLOAT32] = {BRW_SURFACEFORMAT_R32_FLOAT, + BRW_SURFACEFORMAT_R32_FLOAT, + internal_format_en}, + [MESA_FORMAT_R_FLOAT16] = {BRW_SURFACEFORMAT_R16_FLOAT, + BRW_SURFACEFORMAT_R16_FLOAT, + internal_format_en}, + [MESA_FORMAT_RG_FLOAT32] = {BRW_SURFACEFORMAT_R32G32_FLOAT_LD, + BRW_SURFACEFORMAT_R32G32_FLOAT, + internal_format_en}, + [MESA_FORMAT_RG_FLOAT16] = {BRW_SURFACEFORMAT_R16G16_FLOAT, + BRW_SURFACEFORMAT_R16G16_FLOAT, + internal_format_en}, + + [MESA_FORMAT_ALPHA_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, + 0, + 0}, + [MESA_FORMAT_ALPHA_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, + 0, + 0}, + [MESA_FORMAT_ALPHA_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, + 0, + 0}, + [MESA_FORMAT_ALPHA_INT8] = {BRW_SURFACEFORMAT_R8_SINT, + 0, + 0}, + [MESA_FORMAT_ALPHA_INT16] = {BRW_SURFACEFORMAT_R16_SINT, + 0, + 0}, + [MESA_FORMAT_ALPHA_INT32] = {BRW_SURFACEFORMAT_R32_SINT, + 0, + 0}, + + [MESA_FORMAT_INTENSITY_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, + 0, + 0}, + [MESA_FORMAT_INTENSITY_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, + 0, + 0}, + [MESA_FORMAT_INTENSITY_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, + 0, + 0}, + [MESA_FORMAT_INTENSITY_INT8] = {BRW_SURFACEFORMAT_R8_SINT, + 0, + 0}, + [MESA_FORMAT_INTENSITY_INT16] = {BRW_SURFACEFORMAT_R16_SINT, + 0, + 0}, + [MESA_FORMAT_INTENSITY_INT32] = {BRW_SURFACEFORMAT_R32_SINT, + 0, + 0}, + + [MESA_FORMAT_LUMINANCE_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, + 0, + 0}, + [MESA_FORMAT_LUMINANCE_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, + 0, + 0}, + [MESA_FORMAT_LUMINANCE_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, + 0, + 0}, + [MESA_FORMAT_LUMINANCE_INT8] = {BRW_SURFACEFORMAT_R8_SINT, + 0, + 0}, + [MESA_FORMAT_LUMINANCE_INT16] = {BRW_SURFACEFORMAT_R16_SINT, + 0, + 0}, + [MESA_FORMAT_LUMINANCE_INT32] = {BRW_SURFACEFORMAT_R32_SINT, + 0, + 0}, + + [MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, + 0, + 0 | 0}, + [MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, + 0, + 0 | 0}, + [MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, + 0, + 0 | 0}, + [MESA_FORMAT_LUMINANCE_ALPHA_INT8] = {BRW_SURFACEFORMAT_R8_SINT, + 0, + 0 | 0}, + [MESA_FORMAT_LUMINANCE_ALPHA_INT16] = {BRW_SURFACEFORMAT_R16_SINT, + 0, + 0 | 0}, + [MESA_FORMAT_LUMINANCE_ALPHA_INT32] = {BRW_SURFACEFORMAT_R32_SINT, + 0, + 0 | 0}, + + [MESA_FORMAT_R_INT8] = {BRW_SURFACEFORMAT_R8_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_RG_INT8] = {BRW_SURFACEFORMAT_R8G8_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGB_INT8] = {BRW_SURFACEFORMAT_R8G8B8_SINT, + 0, + sample_scale}, + [MESA_FORMAT_RGBA_INT8] = {BRW_SURFACEFORMAT_R8G8B8A8_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_R_INT16] = {BRW_SURFACEFORMAT_R16_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_RG_INT16] = {BRW_SURFACEFORMAT_R16G16_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGB_INT16] = {BRW_SURFACEFORMAT_R16G16B16_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_INT16] = {BRW_SURFACEFORMAT_R16G16B16A16_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_R_INT32] = {BRW_SURFACEFORMAT_R32_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_RG_INT32] = {BRW_SURFACEFORMAT_R32G32_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGB_INT32] = {BRW_SURFACEFORMAT_R32G32B32_SINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_INT32] = {BRW_SURFACEFORMAT_R32G32B32A32_SINT, /* A-blend not supported */ + 0, + internal_format_en}, + + [MESA_FORMAT_R_UINT8] = {BRW_SURFACEFORMAT_R8_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_RG_UINT8] = {BRW_SURFACEFORMAT_R8G8_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGB_UINT8] = {BRW_SURFACEFORMAT_R8G8B8_UINT, + 0, + sample_scale}, + [MESA_FORMAT_RGBA_UINT8] = {BRW_SURFACEFORMAT_R8G8B8A8_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_R_UINT16] = {BRW_SURFACEFORMAT_R16_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_RG_UINT16] = {BRW_SURFACEFORMAT_R16G16_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGB_UINT16] = {BRW_SURFACEFORMAT_R16G16B16_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_UINT16] = {BRW_SURFACEFORMAT_R16G16B16A16_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_R_UINT32] = {BRW_SURFACEFORMAT_R32_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_RG_UINT32] = {BRW_SURFACEFORMAT_R32G32_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGB_UINT32] = {BRW_SURFACEFORMAT_R32G32B32_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_UINT32] = {BRW_SURFACEFORMAT_R32G32B32A32_UINT, /* A-blend not supported */ + 0, + internal_format_en}, + + [MESA_FORMAT_DUDV8] = {BRW_SURFACEFORMAT_R8G8_SNORM, + 0, + internal_format_en}, + [MESA_FORMAT_SIGNED_R8] = {BRW_SURFACEFORMAT_R8_SNORM, + 0, + internal_format_en}, + [MESA_FORMAT_SIGNED_RG88_REV] = {BRW_SURFACEFORMAT_R8G8_SNORM, + 0, + internal_format_en}, + [MESA_FORMAT_SIGNED_RGBX8888] = {0, + 0, + alpha_blend_render | swizzle_all}, + [MESA_FORMAT_SIGNED_RGBA8888] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_RGBA8888_REV] = {BRW_SURFACEFORMAT_R8G8B8A8_SNORM, + 0, + internal_format_en}, + [MESA_FORMAT_SIGNED_R16] = {BRW_SURFACEFORMAT_R16_SNORM, + 0, + internal_format_en}, + [MESA_FORMAT_SIGNED_GR1616] = {BRW_SURFACEFORMAT_R16G16_SNORM, + 0, + internal_format_en}, + [MESA_FORMAT_SIGNED_RGB_16] = {BRW_SURFACEFORMAT_R16G16B16_SNORM, + 0, + internal_format_en}, + [MESA_FORMAT_SIGNED_RGBA_16] = {BRW_SURFACEFORMAT_R16G16B16A16_SNORM, + 0, + internal_format_en}, + [MESA_FORMAT_RGBA_16] = {BRW_SURFACEFORMAT_R16G16B16A16_UNORM, + 0, + internal_format_en}, + + [MESA_FORMAT_RED_RGTC1] = {BRW_SURFACEFORMAT_BC4_UNORM, + 0, + internal_format_en}, + [MESA_FORMAT_SIGNED_RED_RGTC1] = {BRW_SURFACEFORMAT_BC4_SNORM, + 0, + internal_format_en}, + [MESA_FORMAT_RG_RGTC2] = {BRW_SURFACEFORMAT_BC5_UNORM, + 0, + internal_format_en}, + [MESA_FORMAT_SIGNED_RG_RGTC2] = {BRW_SURFACEFORMAT_BC5_SNORM, + 0, + internal_format_en}, + + [MESA_FORMAT_L_LATC1] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_L_LATC1] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_LA_LATC2] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_LA_LATC2] = {0, + 0, + swizzle_all}, + + [MESA_FORMAT_ETC1_RGB8] = {BRW_SURFACEFORMAT_ETC1_RGB8, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_RGB8] = {BRW_SURFACEFORMAT_ETC2_RGB8, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_SRGB8] = {BRW_SURFACEFORMAT_ETC2_SRGB8, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_RGBA8_EAC] = {BRW_SURFACEFORMAT_ETC2_EAC_RGBA8, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC] = {BRW_SURFACEFORMAT_ETC2_EAC_SRGB8_A8, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_R11_EAC] = {BRW_SURFACEFORMAT_EAC_R11, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_RG11_EAC] = {BRW_SURFACEFORMAT_EAC_RG11, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_SIGNED_R11_EAC] = {BRW_SURFACEFORMAT_EAC_SIGNED_R11, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_SIGNED_RG11_EAC] = {BRW_SURFACEFORMAT_EAC_SIGNED_RG11, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1] = {BRW_SURFACEFORMAT_ETC2_RGB8_PTA, + 0, + internal_format_en}, + [MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] = {BRW_SURFACEFORMAT_ETC2_SRGB8_PTA, + 0, + internal_format_en}, + + [MESA_FORMAT_SIGNED_A8] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_L8] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_AL88] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_I8] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_A16] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_L16] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_AL1616] = {0, + 0, + swizzle_all}, + [MESA_FORMAT_SIGNED_I16] = {0, + 0, + swizzle_all}, + + [MESA_FORMAT_RGB9_E5_FLOAT] = {BRW_SURFACEFORMAT_R9G9B9E5_SHAREDEXP, + 0, + internal_format_en}, + [MESA_FORMAT_R11_G11_B10_FLOAT] = {BRW_SURFACEFORMAT_R11G11B10_FLOAT, + 0, + internal_format_en}, + + [MESA_FORMAT_Z32_FLOAT] = {BRW_SURFACEFORMAT_I32_FLOAT, + BRW_SURFACEFORMAT_R32_FLOAT, + internal_format_en}, + [MESA_FORMAT_Z32_FLOAT_X24S8] = {BRW_SURFACEFORMAT_R32G32_FLOAT_LD, + BRW_SURFACEFORMAT_R32G32_FLOAT, + internal_format_en}, + + [MESA_FORMAT_ARGB2101010_UINT] = {BRW_SURFACEFORMAT_B10G10R10A2_UINT, + 0, + internal_format_en}, + [MESA_FORMAT_ABGR2101010_UINT] = {BRW_SURFACEFORMAT_R10G10B10A2_UINT, + 0, + internal_format_en}, + + [MESA_FORMAT_XRGB4444_UNORM] = {BRW_SURFACEFORMAT_R8G8_UNORM, + 0, + alpha_blend_render | swizzle_xy | scale_xy}, + [MESA_FORMAT_XRGB1555_UNORM] = {BRW_SURFACEFORMAT_B5G5R5X1_UNORM, + 0, + alpha_blend_render | internal_format_en}, + [MESA_FORMAT_XBGR8888_SNORM] = {BRW_SURFACEFORMAT_R8G8B8A8_SNORM, + 0, + alpha_blend_render | swizzle_all | x_shadow}, + [MESA_FORMAT_XBGR8888_SRGB] = {BRW_SURFACEFORMAT_R8G8B8X8_UNORM_SRGB, + 0, + alpha_blend_render | swizzle_all}, + [MESA_FORMAT_XBGR8888_UINT] = {BRW_SURFACEFORMAT_R8G8B8A8_UINT, + 0, + alpha_blend_render | swizzle_all | x_shadow}, + [MESA_FORMAT_XBGR8888_SINT] = {BRW_SURFACEFORMAT_R8G8B8A8_SINT, + 0, + alpha_blend_render | swizzle_all | x_shadow}, + [MESA_FORMAT_XRGB2101010_UNORM] = {BRW_SURFACEFORMAT_B10G10R10X2_UNORM, + 0, + alpha_blend_render | internal_format_en}, + [MESA_FORMAT_XBGR16161616_UNORM] = {BRW_SURFACEFORMAT_R16G16B16X16_UNORM, + 0, + alpha_blend_render | internal_format_en}, + [MESA_FORMAT_XBGR16161616_SNORM] = {BRW_SURFACEFORMAT_R16G16B16A16_SNORM, + 0, + alpha_blend_render | swizzle_all | x_shadow}, + [MESA_FORMAT_XBGR16161616_FLOAT] = {BRW_SURFACEFORMAT_R16G16B16X16_FLOAT, + 0, + alpha_blend_render | internal_format_en}, + [MESA_FORMAT_XBGR16161616_UINT] = {BRW_SURFACEFORMAT_R16G16B16A16_UINT, + 0, + alpha_blend_render | swizzle_all | x_shadow}, + [MESA_FORMAT_XBGR16161616_SINT] = {BRW_SURFACEFORMAT_R16G16B16A16_SINT, + 0, + alpha_blend_render | swizzle_all | x_shadow}, + [MESA_FORMAT_XBGR32323232_FLOAT] = {BRW_SURFACEFORMAT_R32G32B32X32_FLOAT, + 0, + alpha_blend_render | internal_format_en}, + [MESA_FORMAT_XBGR32323232_UINT] = {BRW_SURFACEFORMAT_R32G32B32A32_UINT, + 0, + alpha_blend_render | swizzle_all | x_shadow}, + [MESA_FORMAT_XBGR32323232_SINT] = {BRW_SURFACEFORMAT_R32G32B32A32_SINT, + 0, + alpha_blend_render | swizzle_all | x_shadow} }; assert(mesa_format < MESA_PRIVATE_FORMAT_COUNT); - *process_flags = table[mesa_format].process_flags; - return table[mesa_format].brw_format; + if (process_flags) { + *process_flags = table[mesa_format].process_flags; + } + if (render_target) { + *render_target = table[mesa_format].brw_render_shadow_format; + } + if (sample_format) { + *sample_format = table[mesa_format].brw_sample_shadow_format; + } } void brw_init_surface_formats(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; - int gen; - gl_format format; memset(&ctx->TextureFormatSupported, 0, sizeof(ctx->TextureFormatSupported)); - gen = brw->gen * 10; - if (brw->is_g4x || brw->is_haswell) - gen += 5; - - for (format = MESA_FORMAT_NONE + 1; format < MESA_FORMAT_COUNT; format++) { - uint32_t texture, render; - const struct surface_format_info *rinfo, *tinfo; - bool is_integer = _mesa_is_format_integer_color(format); + const int gen = (brw->gen * 10) + (brw->is_g4x ? 5 : 0); + for (gl_format format = MESA_FORMAT_NONE + 1; format < MESA_FORMAT_COUNT; format++) { + BRW_SURFACE sample_surface, render_surface; blorp_process_format process_flags; - render = texture = brw_format_for_mesa_format(format, &process_flags); - tinfo = &surface_formats[texture]; + brw_format_for_mesa_format(format, &process_flags, &render_surface, &sample_surface); - /* The value of BRW_SURFACEFORMAT_R32G32B32A32_FLOAT is 0, so don't skip - * it. - */ - if (texture == 0 && format != MESA_FORMAT_RGBA_FLOAT32) - continue; - - process_flags &= supported_mask; - if (gen >= tinfo->sampling && (gen >= tinfo->filtering || is_integer) && 0 == process_flags) - ctx->TextureFormatSupported[format] = true; - - /* Re-map some render target formats to make them supported when they - * wouldn't be using their format for texturing. - */ - switch (render) { - /* For these formats, we just need to read/write the first - * channel into R, which is to say that we just treat them as - * GL_RED. - */ - case BRW_SURFACEFORMAT_I32_FLOAT: - case BRW_SURFACEFORMAT_L32_FLOAT: - render = BRW_SURFACEFORMAT_R32_FLOAT; - break; - case BRW_SURFACEFORMAT_I16_FLOAT: - case BRW_SURFACEFORMAT_L16_FLOAT: - render = BRW_SURFACEFORMAT_R16_FLOAT; - break; - case BRW_SURFACEFORMAT_B8G8R8X8_UNORM: - /* XRGB is handled as ARGB because the chips in this family - * cannot render to XRGB targets. This means that we have to - * mask writes to alpha (ala glColorMask) and reconfigure the - * alpha blending hardware to use GL_ONE (or GL_ZERO) for - * cases where GL_DST_ALPHA (or GL_ONE_MINUS_DST_ALPHA) is - * used. - */ - render = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; - break; - } - - rinfo = &surface_formats[render]; + ctx->TextureFormatSupported[format] = 0 != (process_flags & internal_format_en); + struct surface_format_info render_target_info = surface_formats[render_surface]; /* Note that GL_EXT_texture_integer says that blending doesn't occur for * integer, so we don't need hardware support for blending on it. Other * than that, GL in general requires alpha blending for render targets, * even though we don't support it for some formats. */ - if (gen >= rinfo->render_target && - (gen >= rinfo->alpha_blend || is_integer)) { - brw->render_target_format[format] = render; - brw->format_supported_as_render_target[format] = true; - } + const bool is_integer = _mesa_is_format_integer_color(format); + brw->format_supported_as_render_target[format] = + gen >= render_target_info.render_target && + (gen >= render_target_info.alpha_blend || /* SINTs, UINTs, and YCRCB don't alpha blend. */ + is_integer); } - /* We will check this table for FBO completeness, but the surface format - * table above only covered color rendering. - */ - brw->format_supported_as_render_target[MESA_FORMAT_S8_Z24] = true; - brw->format_supported_as_render_target[MESA_FORMAT_X8_Z24] = true; - brw->format_supported_as_render_target[MESA_FORMAT_S8] = true; - brw->format_supported_as_render_target[MESA_FORMAT_Z16] = true; - brw->format_supported_as_render_target[MESA_FORMAT_Z32_FLOAT] = true; - brw->format_supported_as_render_target[MESA_FORMAT_Z32_FLOAT_X24S8] = true; - - /* We remap depth formats to a supported texturing format in - * translate_tex_format(). - */ - ctx->TextureFormatSupported[MESA_FORMAT_S8_Z24] = true; - ctx->TextureFormatSupported[MESA_FORMAT_X8_Z24] = true; - ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT] = true; - ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8] = true; - /* It appears that Z16 is slower than Z24 (on Intel Ivybridge and newer * hardware at least), so there's no real reason to prefer it unless you're * under memory (not memory bandwidth) pressure. Our speculation is that @@ -705,36 +1018,19 @@ brw_render_target_supported(struct brw_context *brw, return brw->format_supported_as_render_target[format]; } -GLuint +void translate_tex_format(struct brw_context *brw, gl_format mesa_format, GLenum srgb_decode, - bool for_render, - blorp_process_format *process_flags) + blorp_process_format *process_flags, + BRW_SURFACE *render_surface, + BRW_SURFACE *sample_surface) { if (srgb_decode == GL_SKIP_DECODE_EXT) mesa_format = _mesa_get_srgb_format_linear(mesa_format); - switch( mesa_format ) { - - case MESA_FORMAT_S8: - return BRW_SURFACEFORMAT_R8_UNORM; - - case MESA_FORMAT_Z16: - return BRW_SURFACEFORMAT_R16_UNORM; - - case MESA_FORMAT_S8_Z24: - case MESA_FORMAT_X8_Z24: - return BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS; - - case MESA_FORMAT_Z32_FLOAT: - return BRW_SURFACEFORMAT_R32_FLOAT; - - case MESA_FORMAT_Z32_FLOAT_X24S8: - return BRW_SURFACEFORMAT_R32_FLOAT_X8X24_TYPELESS; - - case MESA_FORMAT_SRGB_DXT1: - if (brw->gen == 4 && !brw->is_g4x) { + if (mesa_format == MESA_FORMAT_SRGB_DXT1 && + (brw->gen == 4 && !brw->is_g4x)) { /* Work around missing SRGB DXT1 support on original gen4 by just * skipping SRGB decode. It's not worth not supporting sRGB in * general to prevent this. @@ -744,9 +1040,8 @@ translate_tex_format(struct brw_context *brw, mesa_format = MESA_FORMAT_RGB_DXT1; } - default: - return brw_format_for_mesa_format(mesa_format, process_flags); - } + brw_format_for_mesa_format(mesa_format, process_flags, + render_surface, sample_surface); } /** Can HiZ be enabled on a depthbuffer of the given format? */ diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c index 0b5174f42b..89de307fc3 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -239,7 +239,8 @@ brw_update_buffer_texture_surface(struct gl_context *ctx, drm_intel_bo *bo = NULL; gl_format format = tObj->_BufferObjectFormat; blorp_process_format process_flags; - uint32_t brw_format = brw_format_for_mesa_format(format, &process_flags); + BRW_SURFACE brw_format; + brw_format_for_mesa_format(format, &process_flags, 0, &brw_format); int texel_size = _mesa_get_format_bytes(format); if (intel_obj) { @@ -286,14 +287,26 @@ brw_update_texture_surface(struct gl_context *ctx, (void) for_gather; /* no w/a to apply for this gen */ blorp_process_format process_flags; + BRW_SURFACE brw_surface; + BRW_SURFACE *dst_format; + BRW_SURFACE *src_format; + + if (for_gather) { + dst_format = 0; + src_format = &brw_surface; + } else { + dst_format = &brw_surface; + src_format = 0; + } + translate_tex_format(brw, + mt->format, + sampler->sRGBDecode, + &process_flags, dst_format, src_format); + surf[0] = (translate_tex_target(tObj->Target) << BRW_SURFACE_TYPE_SHIFT | BRW_SURFACE_MIPMAPLAYOUT_BELOW << BRW_SURFACE_MIPLAYOUT_SHIFT | BRW_SURFACE_CUBEFACE_ENABLES | - (translate_tex_format(brw, - mt->format, - sampler->sRGBDecode, - false, &process_flags) << - BRW_SURFACE_FORMAT_SHIFT)); + (brw_surface << BRW_SURFACE_FORMAT_SHIFT)); surf[1] = intelObj->mt->region->bo->offset + intelObj->mt->offset; /* reloc */ @@ -597,7 +610,7 @@ brw_update_renderbuffer_surface(struct brw_context *brw, struct intel_region *region; uint32_t *surf; uint32_t tile_x, tile_y; - uint32_t format = 0; + /* _NEW_BUFFERS */ gl_format rb_format = _mesa_get_render_format(ctx, intel_rb_format(irb)); uint32_t surf_index = @@ -627,8 +640,11 @@ brw_update_renderbuffer_surface(struct brw_context *brw, surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 6 * 4, 32, &brw->wm.base.surf_offset[surf_index]); - format = brw->render_target_format[rb_format]; - if (unlikely(!brw->format_supported_as_render_target[rb_format])) { + blorp_process_format process_format_flags; + BRW_SURFACE format; + brw_format_for_mesa_format(format, &process_format_flags, &format, 0); + + if (unlikely(!brw_format_for_render(brw, rb_format))) { _mesa_problem(ctx, "%s: renderbuffer format %s unsupported\n", __FUNCTION__, _mesa_get_format_name(rb_format)); } diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c index ac57f7f066..4cd294d15e 100644 --- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c @@ -290,12 +290,22 @@ gen7_update_texture_surface(struct gl_context *ctx, memset(surf, 0, 8 * 4); blorp_process_format process_flags; - uint32_t tex_format = translate_tex_format(brw, - mt->format, - sampler->sRGBDecode); + BRW_SURFACE tex_format; + BRW_SURFACE *dst_format; + BRW_SURFACE *src_format; - if (for_gather && tex_format == BRW_SURFACEFORMAT_R32G32_FLOAT) - tex_format = BRW_SURFACEFORMAT_R32G32_FLOAT_LD; + if (for_gather) { + dst_format = 0; + src_format = &tex_format; + } else { + dst_format = &tex_format; + src_format = 0; + } + + translate_tex_format(brw, + mt->format, + sampler->sRGBDecode, + &process_flags, dst_format, src_format); surf[0] = translate_tex_target(tObj->Target) << BRW_SURFACE_TYPE_SHIFT | tex_format << BRW_SURFACE_FORMAT_SHIFT | @@ -440,7 +450,6 @@ gen7_update_renderbuffer_surface(struct brw_context *brw, struct gl_context *ctx = &brw->ctx; struct intel_renderbuffer *irb = intel_renderbuffer(rb); struct intel_region *region = irb->mt->region; - uint32_t format; /* _NEW_BUFFERS */ gl_format rb_format = _mesa_get_render_format(ctx, intel_rb_format(irb)); uint32_t surftype; @@ -464,7 +473,8 @@ gen7_update_renderbuffer_surface(struct brw_context *brw, assert(irb->mt->msaa_layout != INTEL_MSAA_LAYOUT_IMS); assert(brw_render_target_supported(brw, rb)); - format = brw->render_target_format[rb_format]; + BRW_SURFACE format; + brw_format_for_mesa_format(rb_format, 0, &format, 0); if (unlikely(!brw->format_supported_as_render_target[rb_format])) { _mesa_problem(ctx, "%s: renderbuffer format %s unsupported\n", __FUNCTION__, _mesa_get_format_name(rb_format)); |