X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_wm_surface_state.c;h=d8a8d4743834b886d39f6adf2c07722a37760143;hb=e81df76f288943857cef865bb5d6434dc492cf92;hp=66301a9b08cafec80d8e0788e4567970b000169f;hpb=71f06344a0d72a6bd27750ceca571fc016b8de85;p=android-x86%2Fexternal-mesa.git 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 66301a9b08c..d8a8d474383 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -30,6 +30,8 @@ */ +#include "main/context.h" +#include "main/blend.h" #include "main/mtypes.h" #include "main/samplerobj.h" #include "program/prog_parameter.h" @@ -59,12 +61,15 @@ translate_tex_target(GLenum target) case GL_TEXTURE_2D: case GL_TEXTURE_2D_ARRAY_EXT: case GL_TEXTURE_EXTERNAL_OES: + case GL_TEXTURE_2D_MULTISAMPLE: + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: return BRW_SURFACE_2D; case GL_TEXTURE_3D: return BRW_SURFACE_3D; case GL_TEXTURE_CUBE_MAP: + case GL_TEXTURE_CUBE_MAP_ARRAY: return BRW_SURFACE_CUBE; default: @@ -120,6 +125,13 @@ struct surface_format_info { * color - Color Processing * * See page 88 of the Sandybridge PRM VOL4_Part1 PDF. + * + * As of Ivybridge, the columns are no longer in that table and the + * information can be found spread across: + * + * - VOL2_Part1 section 2.5.11 Format Conversion (vertex fetch). + * - VOL4_Part1 section 2.12.2.1.2 Sampler Output Channel Mapping. + * - VOL4_Part1 section 3.9.11 Render Target Write. */ const struct surface_format_info surface_formats[] = { /* smpl filt shad CK RT AB VB SO color */ @@ -132,6 +144,8 @@ const struct surface_format_info surface_formats[] = { SF( Y, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R32G32B32X32_FLOAT) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32A32_SSCALED) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32A32_USCALED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R32G32B32A32_SFIXED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R64G64_PASSTHRU) SF( Y, 50, x, x, x, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32B32_FLOAT) SF( Y, x, x, x, x, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32B32_SINT) SF( Y, x, x, x, x, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32B32_UINT) @@ -139,6 +153,7 @@ const struct surface_format_info surface_formats[] = { SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32_SNORM) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32_SSCALED) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32_USCALED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R32G32B32_SFIXED) SF( Y, Y, x, x, Y, 45, Y, x, 60, BRW_SURFACEFORMAT_R16G16B16A16_UNORM) SF( Y, Y, x, x, Y, 60, Y, x, x, BRW_SURFACEFORMAT_R16G16B16A16_SNORM) SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16A16_SINT) @@ -162,6 +177,8 @@ const struct surface_format_info surface_formats[] = { SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16A16_USCALED) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32_SSCALED) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32_USCALED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R32G32_SFIXED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R64_PASSTHRU) SF( Y, Y, x, Y, Y, Y, Y, x, 60, BRW_SURFACEFORMAT_B8G8R8A8_UNORM) SF( Y, Y, x, x, Y, Y, x, x, x, BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB) /* smpl filt shad CK RT AB VB SO color */ @@ -226,6 +243,8 @@ const struct surface_format_info surface_formats[] = { SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R16_SINT) SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R16_UINT) SF( Y, Y, x, x, Y, Y, Y, x, x, BRW_SURFACEFORMAT_R16_FLOAT) + SF(50, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_A8P8_UNORM_PALETTE0) + SF(50, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_A8P8_UNORM_PALETTE1) SF( Y, Y, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_I16_UNORM) SF( Y, Y, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_L16_UNORM) SF( Y, Y, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_A16_UNORM) @@ -242,6 +261,12 @@ const struct surface_format_info surface_formats[] = { /* smpl filt shad CK RT AB VB SO color */ SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16_SSCALED) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16_USCALED) + SF(50, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_P8A8_UNORM_PALETTE0) + SF(50, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_P8A8_UNORM_PALETTE1) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_A1B5G5R5_UNORM) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_A4B4G4R4_UNORM) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L8A8_UINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L8A8_SINT) SF( Y, Y, x, 45, Y, Y, Y, x, x, BRW_SURFACEFORMAT_R8_UNORM) SF( Y, Y, x, x, Y, 60, Y, x, x, BRW_SURFACEFORMAT_R8_SNORM) SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R8_SINT) @@ -253,11 +278,22 @@ const struct surface_format_info surface_formats[] = { SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_A4P4_UNORM) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8_SSCALED) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8_USCALED) + SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_P8_UNORM_PALETTE0) SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L8_UNORM_SRGB) + SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_P8_UNORM_PALETTE1) + SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_P4A4_UNORM_PALETTE1) + SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_A4P4_UNORM_PALETTE1) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_Y8_SNORM) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L8_UINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L8_SINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_I8_UINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_I8_SINT) SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_DXT1_RGB_SRGB) SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R1_UINT) SF( Y, Y, x, Y, Y, x, x, x, 60, BRW_SURFACEFORMAT_YCRCB_NORMAL) SF( Y, Y, x, Y, Y, x, x, x, 60, BRW_SURFACEFORMAT_YCRCB_SWAPUVY) + SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_P2_UNORM_PALETTE0) + SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_P2_UNORM_PALETTE1) SF( Y, Y, x, Y, x, x, x, x, x, BRW_SURFACEFORMAT_BC1_UNORM) SF( Y, Y, x, Y, x, x, x, x, x, BRW_SURFACEFORMAT_BC2_UNORM) SF( Y, Y, x, Y, x, x, x, x, x, BRW_SURFACEFORMAT_BC3_UNORM) @@ -280,10 +316,44 @@ const struct surface_format_info surface_formats[] = { SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R64G64B64_FLOAT) SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC4_SNORM) SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC5_SNORM) + SF(50, 50, x, x, x, x, 60, x, x, BRW_SURFACEFORMAT_R16G16B16_FLOAT) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16_UNORM) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16_SNORM) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16_SSCALED) SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16_USCALED) + SF(70, 70, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC6H_SF16) + SF(70, 70, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC7_UNORM) + SF(70, 70, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC7_UNORM_SRGB) + SF(70, 70, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC6H_UF16) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_PLANAR_420_8) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R8G8B8_UNORM_SRGB) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_ETC1_RGB8) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_ETC2_RGB8) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_EAC_R11) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_EAC_RG11) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_EAC_SIGNED_R11) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_EAC_SIGNED_RG11) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_ETC2_SRGB8) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R16G16B16_UINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R16G16B16_SINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R32_SFIXED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R10G10B10A2_SNORM) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R10G10B10A2_USCALED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R10G10B10A2_SSCALED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R10G10B10A2_SINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_B10G10R10A2_SNORM) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_B10G10R10A2_USCALED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_B10G10R10A2_SSCALED) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_B10G10R10A2_UINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_B10G10R10A2_SINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R64G64B64A64_PASSTHRU) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R64G64B64_PASSTHRU) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_ETC2_RGB8_PTA) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_ETC2_SRGB8_PTA) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_ETC2_EAC_RGBA8) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_ETC2_EAC_SRGB8_A8) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R8G8B8_UINT) + SF( x, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R8G8B8_SINT) }; #undef x #undef Y @@ -307,7 +377,7 @@ brw_format_for_mesa_format(gl_format mesa_format) [MESA_FORMAT_XRGB8888] = BRW_SURFACEFORMAT_B8G8R8X8_UNORM, [MESA_FORMAT_XRGB8888_REV] = 0, [MESA_FORMAT_RGB888] = 0, - [MESA_FORMAT_BGR888] = 0, + [MESA_FORMAT_BGR888] = BRW_SURFACEFORMAT_R8G8B8_UNORM, [MESA_FORMAT_RGB565] = BRW_SURFACEFORMAT_B5G6R5_UNORM, [MESA_FORMAT_RGB565_REV] = 0, [MESA_FORMAT_ARGB4444] = BRW_SURFACEFORMAT_B4G4R4A4_UNORM, @@ -333,10 +403,9 @@ brw_format_for_mesa_format(gl_format mesa_format) [MESA_FORMAT_GR88] = BRW_SURFACEFORMAT_R8G8_UNORM, [MESA_FORMAT_RG88] = 0, [MESA_FORMAT_R16] = BRW_SURFACEFORMAT_R16_UNORM, - [MESA_FORMAT_RG1616] = BRW_SURFACEFORMAT_R16G16_UNORM, - [MESA_FORMAT_RG1616_REV] = 0, + [MESA_FORMAT_GR1616] = BRW_SURFACEFORMAT_R16G16_UNORM, + [MESA_FORMAT_RG1616] = 0, [MESA_FORMAT_ARGB2101010] = BRW_SURFACEFORMAT_B10G10R10A2_UNORM, - [MESA_FORMAT_ABGR2101010_UINT] = BRW_SURFACEFORMAT_R10G10B10A2_UINT, [MESA_FORMAT_Z24_S8] = 0, [MESA_FORMAT_S8_Z24] = 0, [MESA_FORMAT_Z16] = 0, @@ -364,8 +433,8 @@ brw_format_for_mesa_format(gl_format mesa_format) [MESA_FORMAT_RGBA_FLOAT32] = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT, [MESA_FORMAT_RGBA_FLOAT16] = BRW_SURFACEFORMAT_R16G16B16A16_FLOAT, - [MESA_FORMAT_RGB_FLOAT32] = 0, - [MESA_FORMAT_RGB_FLOAT16] = 0, + [MESA_FORMAT_RGB_FLOAT32] = BRW_SURFACEFORMAT_R32G32B32_FLOAT, + [MESA_FORMAT_RGB_FLOAT16] = BRW_SURFACEFORMAT_R16G16B16_FLOAT, [MESA_FORMAT_ALPHA_FLOAT32] = BRW_SURFACEFORMAT_A32_FLOAT, [MESA_FORMAT_ALPHA_FLOAT16] = BRW_SURFACEFORMAT_A16_FLOAT, [MESA_FORMAT_LUMINANCE_FLOAT32] = BRW_SURFACEFORMAT_L32_FLOAT, @@ -409,11 +478,11 @@ brw_format_for_mesa_format(gl_format mesa_format) [MESA_FORMAT_R_INT8] = BRW_SURFACEFORMAT_R8_SINT, [MESA_FORMAT_RG_INT8] = BRW_SURFACEFORMAT_R8G8_SINT, - [MESA_FORMAT_RGB_INT8] = 0, + [MESA_FORMAT_RGB_INT8] = BRW_SURFACEFORMAT_R8G8B8_SINT, [MESA_FORMAT_RGBA_INT8] = BRW_SURFACEFORMAT_R8G8B8A8_SINT, [MESA_FORMAT_R_INT16] = BRW_SURFACEFORMAT_R16_SINT, [MESA_FORMAT_RG_INT16] = BRW_SURFACEFORMAT_R16G16_SINT, - [MESA_FORMAT_RGB_INT16] = 0, + [MESA_FORMAT_RGB_INT16] = BRW_SURFACEFORMAT_R16G16B16_SINT, [MESA_FORMAT_RGBA_INT16] = BRW_SURFACEFORMAT_R16G16B16A16_SINT, [MESA_FORMAT_R_INT32] = BRW_SURFACEFORMAT_R32_SINT, [MESA_FORMAT_RG_INT32] = BRW_SURFACEFORMAT_R32G32_SINT, @@ -422,11 +491,11 @@ brw_format_for_mesa_format(gl_format mesa_format) [MESA_FORMAT_R_UINT8] = BRW_SURFACEFORMAT_R8_UINT, [MESA_FORMAT_RG_UINT8] = BRW_SURFACEFORMAT_R8G8_UINT, - [MESA_FORMAT_RGB_UINT8] = 0, + [MESA_FORMAT_RGB_UINT8] = BRW_SURFACEFORMAT_R8G8B8_UINT, [MESA_FORMAT_RGBA_UINT8] = BRW_SURFACEFORMAT_R8G8B8A8_UINT, [MESA_FORMAT_R_UINT16] = BRW_SURFACEFORMAT_R16_UINT, [MESA_FORMAT_RG_UINT16] = BRW_SURFACEFORMAT_R16G16_UINT, - [MESA_FORMAT_RGB_UINT16] = 0, + [MESA_FORMAT_RGB_UINT16] = BRW_SURFACEFORMAT_R16G16B16_UINT, [MESA_FORMAT_RGBA_UINT16] = BRW_SURFACEFORMAT_R16G16B16A16_UINT, [MESA_FORMAT_R_UINT32] = BRW_SURFACEFORMAT_R32_UINT, [MESA_FORMAT_RG_UINT32] = BRW_SURFACEFORMAT_R32G32_UINT, @@ -441,7 +510,7 @@ brw_format_for_mesa_format(gl_format mesa_format) [MESA_FORMAT_SIGNED_RGBA8888_REV] = BRW_SURFACEFORMAT_R8G8B8A8_SNORM, [MESA_FORMAT_SIGNED_R16] = BRW_SURFACEFORMAT_R16_SNORM, [MESA_FORMAT_SIGNED_GR1616] = BRW_SURFACEFORMAT_R16G16_SNORM, - [MESA_FORMAT_SIGNED_RGB_16] = 0, + [MESA_FORMAT_SIGNED_RGB_16] = BRW_SURFACEFORMAT_R16G16B16_SNORM, [MESA_FORMAT_SIGNED_RGBA_16] = BRW_SURFACEFORMAT_R16G16B16A16_SNORM, [MESA_FORMAT_RGBA_16] = BRW_SURFACEFORMAT_R16G16B16A16_UNORM, @@ -455,6 +524,18 @@ brw_format_for_mesa_format(gl_format mesa_format) [MESA_FORMAT_LA_LATC2] = 0, [MESA_FORMAT_SIGNED_LA_LATC2] = 0, + [MESA_FORMAT_ETC1_RGB8] = BRW_SURFACEFORMAT_ETC1_RGB8, + [MESA_FORMAT_ETC2_RGB8] = BRW_SURFACEFORMAT_ETC2_RGB8, + [MESA_FORMAT_ETC2_SRGB8] = BRW_SURFACEFORMAT_ETC2_SRGB8, + [MESA_FORMAT_ETC2_RGBA8_EAC] = BRW_SURFACEFORMAT_ETC2_EAC_RGBA8, + [MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC] = BRW_SURFACEFORMAT_ETC2_EAC_SRGB8_A8, + [MESA_FORMAT_ETC2_R11_EAC] = BRW_SURFACEFORMAT_EAC_R11, + [MESA_FORMAT_ETC2_RG11_EAC] = BRW_SURFACEFORMAT_EAC_RG11, + [MESA_FORMAT_ETC2_SIGNED_R11_EAC] = BRW_SURFACEFORMAT_EAC_SIGNED_R11, + [MESA_FORMAT_ETC2_SIGNED_RG11_EAC] = BRW_SURFACEFORMAT_EAC_SIGNED_RG11, + [MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1] = BRW_SURFACEFORMAT_ETC2_RGB8_PTA, + [MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] = BRW_SURFACEFORMAT_ETC2_SRGB8_PTA, + [MESA_FORMAT_SIGNED_A8] = 0, [MESA_FORMAT_SIGNED_L8] = 0, [MESA_FORMAT_SIGNED_AL88] = 0, @@ -469,6 +550,25 @@ brw_format_for_mesa_format(gl_format mesa_format) [MESA_FORMAT_Z32_FLOAT] = 0, [MESA_FORMAT_Z32_FLOAT_X24S8] = 0, + + [MESA_FORMAT_ARGB2101010_UINT] = BRW_SURFACEFORMAT_B10G10R10A2_UINT, + [MESA_FORMAT_ABGR2101010_UINT] = BRW_SURFACEFORMAT_R10G10B10A2_UINT, + + [MESA_FORMAT_XRGB4444_UNORM] = 0, + [MESA_FORMAT_XRGB1555_UNORM] = BRW_SURFACEFORMAT_B5G5R5X1_UNORM, + [MESA_FORMAT_XBGR8888_SNORM] = 0, + [MESA_FORMAT_XBGR8888_SRGB] = 0, + [MESA_FORMAT_XBGR8888_UINT] = 0, + [MESA_FORMAT_XBGR8888_SINT] = 0, + [MESA_FORMAT_XRGB2101010_UNORM] = BRW_SURFACEFORMAT_B10G10R10X2_UNORM, + [MESA_FORMAT_XBGR16161616_UNORM] = BRW_SURFACEFORMAT_R16G16B16X16_UNORM, + [MESA_FORMAT_XBGR16161616_SNORM] = 0, + [MESA_FORMAT_XBGR16161616_FLOAT] = BRW_SURFACEFORMAT_R16G16B16X16_FLOAT, + [MESA_FORMAT_XBGR16161616_UINT] = 0, + [MESA_FORMAT_XBGR16161616_SINT] = 0, + [MESA_FORMAT_XBGR32323232_FLOAT] = BRW_SURFACEFORMAT_R32G32B32X32_FLOAT, + [MESA_FORMAT_XBGR32323232_UINT] = 0, + [MESA_FORMAT_XBGR32323232_SINT] = 0, }; assert(mesa_format < MESA_FORMAT_COUNT); return table[mesa_format]; @@ -562,12 +662,40 @@ brw_init_surface_formats(struct brw_context *brw) ctx->TextureFormatSupported[MESA_FORMAT_X8_Z24] = true; ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT] = true; ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8] = true; - ctx->TextureFormatSupported[MESA_FORMAT_Z16] = 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 + * this is due to either increased fragment shader execution from + * GL_LEQUAL/GL_EQUAL depth tests at the reduced precision, or due to + * increased depth stalls from a cacheline-based heuristic for detecting + * depth stalls. + * + * However, desktop GL 3.0+ require that you get exactly 16 bits when + * asking for DEPTH_COMPONENT16, so we have to respect that. + */ + if (_mesa_is_desktop_gl(ctx)) + ctx->TextureFormatSupported[MESA_FORMAT_Z16] = true; /* On hardware that lacks support for ETC1, we map ETC1 to RGBX * during glCompressedTexImage2D(). See intel_mipmap_tree::wraps_etc1. */ ctx->TextureFormatSupported[MESA_FORMAT_ETC1_RGB8] = true; + + /* On hardware that lacks support for ETC2, we map ETC2 to a suitable + * MESA_FORMAT during glCompressedTexImage2D(). + * See intel_mipmap_tree::wraps_etc2. + */ + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_RGB8] = true; + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SRGB8] = true; + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_RGBA8_EAC] = true; + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC] = true; + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_R11_EAC] = true; + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_RG11_EAC] = true; + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SIGNED_R11_EAC] = true; + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SIGNED_RG11_EAC] = true; + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1] = true; + ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] = true; } bool @@ -605,11 +733,13 @@ brw_render_target_supported(struct intel_context *intel, } GLuint -translate_tex_format(gl_format mesa_format, +translate_tex_format(struct intel_context *intel, + gl_format mesa_format, GLenum internal_format, GLenum depth_mode, GLenum srgb_decode) { + struct gl_context *ctx = &intel->ctx; if (srgb_decode == GL_SKIP_DECODE_EXT) mesa_format = _mesa_get_srgb_format_linear(mesa_format); @@ -634,6 +764,17 @@ translate_tex_format(gl_format mesa_format, */ return BRW_SURFACEFORMAT_R32G32B32A32_FLOAT; + case MESA_FORMAT_SRGB_DXT1: + if (intel->gen == 4 && !intel->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. + */ + WARN_ONCE(true, "Demoting sRGB DXT1 texture to non-sRGB\n"); + mesa_format = MESA_FORMAT_RGB_DXT1; + } + return brw_format_for_mesa_format(mesa_format); + default: assert(brw_format_for_mesa_format(mesa_format) != 0); return brw_format_for_mesa_format(mesa_format); @@ -669,7 +810,8 @@ brw_get_surface_num_multisamples(unsigned num_samples) * swizzling. */ int -brw_get_texture_swizzle(const struct gl_texture_object *t) +brw_get_texture_swizzle(const struct gl_context *ctx, + const struct gl_texture_object *t) { const struct gl_texture_image *img = t->Image[0][t->BaseLevel]; @@ -685,7 +827,19 @@ brw_get_texture_swizzle(const struct gl_texture_object *t) if (img->_BaseFormat == GL_DEPTH_COMPONENT || img->_BaseFormat == GL_DEPTH_STENCIL) { - switch (t->DepthMode) { + GLenum depth_mode = t->DepthMode; + + /* In ES 3.0, DEPTH_TEXTURE_MODE is expected to be GL_RED for textures + * with depth component data specified with a sized internal format. + * Otherwise, it's left at the old default, GL_LUMINANCE. + */ + if (_mesa_is_gles3(ctx) && + img->InternalFormat != GL_DEPTH_COMPONENT && + img->InternalFormat != GL_DEPTH_STENCIL) { + depth_mode = GL_RED; + } + + switch (depth_mode) { case GL_ALPHA: swizzles[0] = SWIZZLE_ZERO; swizzles[1] = SWIZZLE_ZERO; @@ -713,6 +867,26 @@ brw_get_texture_swizzle(const struct gl_texture_object *t) } } + /* If the texture's format is alpha-only, force R, G, and B to + * 0.0. Similarly, if the texture's format has no alpha channel, + * force the alpha value read to 1.0. This allows for the + * implementation to use an RGBA texture for any of these formats + * without leaking any unexpected values. + */ + switch (img->_BaseFormat) { + case GL_ALPHA: + swizzles[0] = SWIZZLE_ZERO; + swizzles[1] = SWIZZLE_ZERO; + swizzles[2] = SWIZZLE_ZERO; + break; + case GL_RED: + case GL_RG: + case GL_RGB: + if (_mesa_get_format_bits(img->TexFormat, GL_ALPHA_BITS) > 0) + swizzles[3] = SWIZZLE_ONE; + break; + } + return MAKE_SWIZZLE4(swizzles[GET_SWZ(t->_Swizzle, 0)], swizzles[GET_SWZ(t->_Swizzle, 1)], swizzles[GET_SWZ(t->_Swizzle, 2)], @@ -775,6 +949,87 @@ brw_update_buffer_texture_surface(struct gl_context *ctx, } static void +brw_update_texture_component(struct brw_context *brw, + uint32_t *binding_table_slot, + const struct intel_mipmap_tree *mt, + unsigned width, unsigned height, + unsigned depth, unsigned stride, + GLuint target, GLuint tex_format, + uint32_t offset, uint32_t levels, + uint32_t first_level) +{ + uint32_t tile_x, tile_y; + uint32_t *surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, + 6 * 4, 32, binding_table_slot); + + surf[0] = (target << BRW_SURFACE_TYPE_SHIFT | + BRW_SURFACE_MIPMAPLAYOUT_BELOW << BRW_SURFACE_MIPLAYOUT_SHIFT | + BRW_SURFACE_CUBEFACE_ENABLES | + (tex_format << BRW_SURFACE_FORMAT_SHIFT)); + + surf[1] = mt->region->bo->offset + offset; + surf[1] += intel_miptree_get_tile_offsets(mt, first_level, 0, + &tile_x, &tile_y); + + surf[2] = (levels << BRW_SURFACE_LOD_SHIFT | + (width - 1) << BRW_SURFACE_WIDTH_SHIFT | + (height - 1) << BRW_SURFACE_HEIGHT_SHIFT); + + surf[3] = (brw_get_surface_tiling_bits(mt->region->tiling) | + (depth - 1) << BRW_SURFACE_DEPTH_SHIFT | + (stride - 1) << BRW_SURFACE_PITCH_SHIFT); + + surf[4] = brw_get_surface_num_multisamples(mt->num_samples); + + assert(brw->has_surface_tile_offset || (tile_x == 0 && tile_y == 0)); + /* Note that the low bits of these fields are missing, so + * there's the possibility of getting in trouble. + */ + assert(tile_x % 4 == 0); + assert(tile_y % 2 == 0); + surf[5] = ((tile_x / 4) << BRW_SURFACE_X_OFFSET_SHIFT | + (tile_y / 2) << BRW_SURFACE_Y_OFFSET_SHIFT | + (mt->align_h == 4 ? BRW_SURFACE_VERTICAL_ALIGN_ENABLE : 0)); + + /* Emit relocation to surface contents */ + drm_intel_bo_emit_reloc(brw->intel.batch.bo, + *binding_table_slot + 4, + mt->region->bo, + surf[1] - mt->region->bo->offset, + I915_GEM_DOMAIN_SAMPLER, 0); +} + +static void +brw_update_ext_texture_surface(struct brw_context *brw, + uint32_t *binding_table_slots, + const struct intel_texture_image *intel_img) +{ + unsigned i; + const struct intel_region *region = intel_img->mt->region; + const struct intel_image_format *f = intel_img->ext_format; + + for (i = 0; i < f->nplanes; ++i) { + int format = BRW_SURFACEFORMAT_R8_UNORM; + int index = f->planes[i].buffer_index; + + if (f->planes[i].dri_format == __DRI_IMAGE_FORMAT_GR88) + format = BRW_SURFACEFORMAT_R8G8_UNORM; + + brw_update_texture_component(brw, binding_table_slots + i, + intel_img->mt, + region->width >> f->planes[i].width_shift, + region->height >> f->planes[i].height_shift, + intel_img->base.Base.Depth, + intel_img->ext_strides[index], + BRW_SURFACE_2D, + format, + intel_img->ext_offsets[index], + 0 /*levels*/, + 0 /*first_level*/); + } +} + +static void brw_update_texture_surface(struct gl_context *ctx, unsigned unit, uint32_t *binding_table, @@ -785,65 +1040,49 @@ brw_update_texture_surface(struct gl_context *ctx, struct intel_texture_object *intelObj = intel_texture_object(tObj); struct intel_mipmap_tree *mt = intelObj->mt; struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel]; + const struct intel_texture_image *intel_img = + (const struct intel_texture_image *)firstImage; struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit); - uint32_t *surf; int width, height, depth; if (tObj->Target == GL_TEXTURE_BUFFER) { brw_update_buffer_texture_surface(ctx, unit, binding_table, surf_index); return; } + else if (tObj->Target == GL_TEXTURE_EXTERNAL_OES && intel_img->ext_format) { + brw_update_ext_texture_surface(brw, binding_table + surf_index, + intel_img); + return; + } intel_miptree_get_dimensions_for_image(firstImage, &width, &height, &depth); - surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, - 6 * 4, 32, &binding_table[surf_index]); - - 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(mt->format, - firstImage->InternalFormat, - tObj->DepthMode, - sampler->sRGBDecode) << - BRW_SURFACE_FORMAT_SHIFT)); - - surf[1] = intelObj->mt->region->bo->offset + intelObj->mt->offset; /* reloc */ - - surf[2] = ((intelObj->_MaxLevel - tObj->BaseLevel) << BRW_SURFACE_LOD_SHIFT | - (width - 1) << BRW_SURFACE_WIDTH_SHIFT | - (height - 1) << BRW_SURFACE_HEIGHT_SHIFT); - - surf[3] = (brw_get_surface_tiling_bits(intelObj->mt->region->tiling) | - (depth - 1) << BRW_SURFACE_DEPTH_SHIFT | - ((intelObj->mt->region->pitch * intelObj->mt->cpp) - 1) << - BRW_SURFACE_PITCH_SHIFT); - - surf[4] = 0; - - surf[5] = (mt->align_h == 4) ? BRW_SURFACE_VERTICAL_ALIGN_ENABLE : 0; - - /* Emit relocation to surface contents */ - drm_intel_bo_emit_reloc(brw->intel.batch.bo, - binding_table[surf_index] + 4, - intelObj->mt->region->bo, - intelObj->mt->offset, - I915_GEM_DOMAIN_SAMPLER, 0); + brw_update_texture_component(brw, binding_table + surf_index, + mt, width, height, depth, mt->region->pitch, + translate_tex_target(tObj->Target), + translate_tex_format(intel_context(ctx), mt->format, + firstImage->InternalFormat, tObj->DepthMode, sampler->sRGBDecode), + mt->offset, + intelObj->_MaxLevel - tObj->BaseLevel, + firstImage->Level); } /** * Create the constant buffer surface. Vertex/fragment shader constants will be * read from this buffer with Data Port Read instructions/messages. */ -void +static void brw_create_constant_surface(struct brw_context *brw, drm_intel_bo *bo, uint32_t offset, - int width, - uint32_t *out_offset) + uint32_t size, + uint32_t *out_offset, + bool dword_pitch) { struct intel_context *intel = &brw->intel; - const GLint w = width - 1; + uint32_t stride = dword_pitch ? 4 : 16; + uint32_t elements = ALIGN(size, stride) / stride; + const GLint w = elements - 1; uint32_t *surf; surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, @@ -862,7 +1101,7 @@ brw_create_constant_surface(struct brw_context *brw, ((w >> 7) & 0x1fff) << BRW_SURFACE_HEIGHT_SHIFT); surf[3] = (((w >> 20) & 0x7f) << BRW_SURFACE_DEPTH_SHIFT | - (16 - 1) << BRW_SURFACE_PITCH_SHIFT); /* ignored */ + (stride - 1) << BRW_SURFACE_PITCH_SHIFT); surf[4] = 0; surf[5] = 0; @@ -1009,9 +1248,9 @@ brw_upload_wm_pull_constants(struct brw_context *brw) } drm_intel_gem_bo_unmap_gtt(brw->wm.const_bo); - intel->vtbl.create_constant_surface(brw, brw->wm.const_bo, 0, - params->NumParameters, - &brw->wm.surf_offset[surf_index]); + intel->vtbl.create_constant_surface(brw, brw->wm.const_bo, 0, size, + &brw->wm.surf_offset[surf_index], + true); brw->state.dirty.brw |= BRW_NEW_SURFACES; } @@ -1125,6 +1364,7 @@ brw_update_null_renderbuffer_surface(struct brw_context *brw, unsigned int unit) static void brw_update_renderbuffer_surface(struct brw_context *brw, struct gl_renderbuffer *rb, + bool layered, unsigned int unit) { struct intel_context *intel = &brw->intel; @@ -1135,10 +1375,13 @@ brw_update_renderbuffer_surface(struct brw_context *brw, uint32_t *surf; uint32_t tile_x, tile_y; uint32_t format = 0; - gl_format rb_format = intel_rb_format(irb); + /* _NEW_BUFFERS */ + gl_format rb_format = _mesa_get_render_format(ctx, intel_rb_format(irb)); - if (irb->tex_image && !brw->has_surface_tile_offset) { - intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y); + assert(!layered); + + if (rb->TexImage && !brw->has_surface_tile_offset) { + intel_renderbuffer_get_tile_offsets(irb, &tile_x, &tile_y); if (tile_x != 0 || tile_y != 0) { /* Original gen4 hardware couldn't draw to a non-tile-aligned @@ -1147,7 +1390,7 @@ brw_update_renderbuffer_surface(struct brw_context *brw, * select the image. So, instead, we just make a new single-level * miptree and render into that. */ - intel_renderbuffer_move_to_temp(intel, irb); + intel_renderbuffer_move_to_temp(intel, irb, false); mt = irb->mt; } } @@ -1157,39 +1400,24 @@ brw_update_renderbuffer_surface(struct brw_context *brw, surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 6 * 4, 32, &brw->wm.surf_offset[unit]); - switch (rb_format) { - case MESA_FORMAT_SARGB8: - /* _NEW_BUFFERS - * - * Without GL_EXT_framebuffer_sRGB we shouldn't bind sRGB surfaces to the - * blend/update as sRGB. - */ - if (ctx->Color.sRGBEnabled) - format = brw_format_for_mesa_format(rb_format); - else - format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; - break; - default: - format = brw->render_target_format[rb_format]; - 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)); - } - break; + format = brw->render_target_format[rb_format]; + 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)); } surf[0] = (BRW_SURFACE_2D << BRW_SURFACE_TYPE_SHIFT | format << BRW_SURFACE_FORMAT_SHIFT); /* reloc */ - surf[1] = (intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y) + + surf[1] = (intel_renderbuffer_get_tile_offsets(irb, &tile_x, &tile_y) + region->bo->offset); surf[2] = ((rb->Width - 1) << BRW_SURFACE_WIDTH_SHIFT | (rb->Height - 1) << BRW_SURFACE_HEIGHT_SHIFT); surf[3] = (brw_get_surface_tiling_bits(region->tiling) | - ((region->pitch * region->cpp) - 1) << BRW_SURFACE_PITCH_SHIFT); + (region->pitch - 1) << BRW_SURFACE_PITCH_SHIFT); surf[4] = brw_get_surface_num_multisamples(mt->num_samples); @@ -1248,7 +1476,8 @@ brw_update_renderbuffer_surfaces(struct brw_context *brw) if (ctx->DrawBuffer->_NumColorDrawBuffers >= 1) { for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) { if (intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[i])) { - intel->vtbl.update_renderbuffer_surface(brw, ctx->DrawBuffer->_ColorDrawBuffers[i], i); + intel->vtbl.update_renderbuffer_surface(brw, ctx->DrawBuffer->_ColorDrawBuffers[i], + ctx->DrawBuffer->Layered, i); } else { intel->vtbl.update_null_renderbuffer_surface(brw, i); } @@ -1299,17 +1528,16 @@ brw_update_texture_surfaces(struct brw_context *brw) unsigned num_samplers = _mesa_fls(vs->SamplersUsed | fs->SamplersUsed); for (unsigned s = 0; s < num_samplers; s++) { - brw->vs.surf_offset[SURF_INDEX_VS_TEXTURE(s)] = 0; - brw->wm.surf_offset[SURF_INDEX_TEXTURE(s)] = 0; - if (vs->SamplersUsed & (1 << s)) { const unsigned unit = vs->SamplerUnits[s]; /* _NEW_TEXTURE */ if (ctx->Texture.Unit[unit]._ReallyEnabled) { intel->vtbl.update_texture_surface(ctx, unit, - brw->vs.surf_offset, - SURF_INDEX_VS_TEXTURE(s)); + brw->vs.surf_offset, + brw_surf_index_vs_texture( + (const struct brw_vertex_program *)brw->vertex_program, + s)); } } @@ -1319,8 +1547,10 @@ brw_update_texture_surfaces(struct brw_context *brw) /* _NEW_TEXTURE */ if (ctx->Texture.Unit[unit]._ReallyEnabled) { intel->vtbl.update_texture_surface(ctx, unit, - brw->wm.surf_offset, - SURF_INDEX_TEXTURE(s)); + brw->wm.surf_offset, + brw_surf_index_texture( + (const struct brw_fragment_program *)brw->fragment_program, + s)); } } } @@ -1362,12 +1592,10 @@ brw_upload_ubo_surfaces(struct brw_context *brw, * glBindBufferRange case is undefined, we can just bind the whole buffer * glBindBufferBase wants and be a correct implementation. */ - int size = bo->size - binding->Offset; - size = ALIGN(size, 16) / 16; /* The interface takes a number of vec4s */ - intel->vtbl.create_constant_surface(brw, bo, binding->Offset, - size, - &surf_offsets[i]); + bo->size - binding->Offset, + &surf_offsets[i], + shader->Type == GL_FRAGMENT_SHADER); } if (shader->NumUniformBlocks) @@ -1390,9 +1618,8 @@ brw_upload_wm_ubo_surfaces(struct brw_context *brw) const struct brw_tracked_state brw_wm_ubo_surfaces = { .dirty = { - .mesa = (_NEW_PROGRAM | - _NEW_BUFFER_OBJECT), - .brw = BRW_NEW_BATCH, + .mesa = _NEW_PROGRAM, + .brw = BRW_NEW_BATCH | BRW_NEW_UNIFORM_BUFFER, .cache = 0, }, .emit = brw_upload_wm_ubo_surfaces, @@ -1405,14 +1632,11 @@ const struct brw_tracked_state brw_wm_ubo_surfaces = { static void brw_upload_wm_binding_table(struct brw_context *brw) { - struct intel_context *intel = &brw->intel; uint32_t *bind; int i; if (INTEL_DEBUG & DEBUG_SHADER_TIME) { - intel->vtbl.create_constant_surface(brw, brw->shader_time.bo, 0, - brw->shader_time.bo->size, - &brw->wm.surf_offset[SURF_INDEX_WM_SHADER_TIME]); + gen7_create_shader_time_surface(brw, &brw->wm.surf_offset[SURF_INDEX_WM_SHADER_TIME]); } /* Might want to calculate nr_surfaces first, to avoid taking up so much