From 7ddb21708c800dfbe3cea2df6aaaf7aed852761b Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Sat, 27 Aug 2016 21:39:16 -0700 Subject: [PATCH] intel/isl: Add an isl_swizzle structure and use it for isl_view swizzles This should be more compact than the enum isl_channel_select[4] that we were using before. It's also very convenient because we already had such a structure in the Vulkan driver we just needed to pull it over. Signed-off-by: Jason Ekstrand Reviewed-by: Topi Pohjolainen --- src/intel/blorp/blorp.c | 7 +---- src/intel/blorp/blorp_blit.c | 10 +++--- src/intel/isl/isl.h | 18 ++++++++++- src/intel/isl/isl_surface_state.c | 8 ++--- src/intel/vulkan/anv_formats.c | 9 +----- src/intel/vulkan/anv_image.c | 20 ++++++------ src/intel/vulkan/anv_private.h | 9 +----- .../drivers/dri/i965/brw_wm_surface_state.c | 31 +++++-------------- 8 files changed, 48 insertions(+), 64 deletions(-) diff --git a/src/intel/blorp/blorp.c b/src/intel/blorp/blorp.c index 8dfebbcb2ad..7b3b0978975 100644 --- a/src/intel/blorp/blorp.c +++ b/src/intel/blorp/blorp.c @@ -111,12 +111,7 @@ brw_blorp_surface_info_init(struct blorp_context *blorp, .format = format, .base_level = level, .levels = 1, - .channel_select = { - ISL_CHANNEL_SELECT_RED, - ISL_CHANNEL_SELECT_GREEN, - ISL_CHANNEL_SELECT_BLUE, - ISL_CHANNEL_SELECT_ALPHA, - }, + .swizzle = ISL_SWIZZLE_IDENTITY, }; info->view.array_len = MAX2(info->surf.logical_level0_px.depth, diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c index 2b6adc39f01..0531bfb0d29 100644 --- a/src/intel/blorp/blorp_blit.c +++ b/src/intel/blorp/blorp_blit.c @@ -1637,10 +1637,12 @@ blorp_blit(struct blorp_batch *batch, brw_blorp_get_blit_kernel(batch->blorp, ¶ms, &wm_prog_key); - for (unsigned i = 0; i < 4; i++) { - params.src.view.channel_select[i] = - swizzle_to_scs(GET_SWZ(src_swizzle, i)); - } + params.src.view.swizzle = (struct isl_swizzle) { + .r = swizzle_to_scs(GET_SWZ(src_swizzle, 0)), + .g = swizzle_to_scs(GET_SWZ(src_swizzle, 1)), + .b = swizzle_to_scs(GET_SWZ(src_swizzle, 2)), + .a = swizzle_to_scs(GET_SWZ(src_swizzle, 3)), + }; batch->blorp->exec(batch, ¶ms); } diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index e01624bfae9..d8260b2a0c5 100644 --- a/src/intel/isl/isl.h +++ b/src/intel/isl/isl.h @@ -854,6 +854,22 @@ struct isl_surf { isl_surf_usage_flags_t usage; }; +struct isl_swizzle { + enum isl_channel_select r:4; + enum isl_channel_select g:4; + enum isl_channel_select b:4; + enum isl_channel_select a:4; +}; + +#define ISL_SWIZZLE(R, G, B, A) ((struct isl_swizzle) { \ + .r = ISL_CHANNEL_SELECT_##R, \ + .g = ISL_CHANNEL_SELECT_##G, \ + .b = ISL_CHANNEL_SELECT_##B, \ + .a = ISL_CHANNEL_SELECT_##A, \ + }) + +#define ISL_SWIZZLE_IDENTITY ISL_SWIZZLE(RED, GREEN, BLUE, ALPHA) + struct isl_view { /** * Indicates the usage of the particular view @@ -889,7 +905,7 @@ struct isl_view { uint32_t base_array_layer; uint32_t array_len; - enum isl_channel_select channel_select[4]; + struct isl_swizzle swizzle; }; union isl_color_value { diff --git a/src/intel/isl/isl_surface_state.c b/src/intel/isl/isl_surface_state.c index 5c5386e297c..5845175de34 100644 --- a/src/intel/isl/isl_surface_state.c +++ b/src/intel/isl/isl_surface_state.c @@ -411,10 +411,10 @@ isl_genX(surf_fill_state_s)(const struct isl_device *dev, void *state, #endif #if (GEN_GEN >= 8 || GEN_IS_HASWELL) - s.ShaderChannelSelectRed = info->view->channel_select[0]; - s.ShaderChannelSelectGreen = info->view->channel_select[1]; - s.ShaderChannelSelectBlue = info->view->channel_select[2]; - s.ShaderChannelSelectAlpha = info->view->channel_select[3]; + s.ShaderChannelSelectRed = info->view->swizzle.r; + s.ShaderChannelSelectGreen = info->view->swizzle.g; + s.ShaderChannelSelectBlue = info->view->swizzle.b; + s.ShaderChannelSelectAlpha = info->view->swizzle.a; #endif s.SurfaceBaseAddress = info->address; diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index a746cd3545b..ff59f479fd0 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -24,13 +24,6 @@ #include "anv_private.h" #include "vk_format_info.h" -#define ISL_SWIZZLE(r, g, b, a) { \ - ISL_CHANNEL_SELECT_##r, \ - ISL_CHANNEL_SELECT_##g, \ - ISL_CHANNEL_SELECT_##b, \ - ISL_CHANNEL_SELECT_##a, \ -} - #define RGBA ISL_SWIZZLE(RED, GREEN, BLUE, ALPHA) #define BGRA ISL_SWIZZLE(BLUE, GREEN, RED, ALPHA) #define RGB1 ISL_SWIZZLE(RED, GREEN, BLUE, ONE) @@ -283,7 +276,7 @@ anv_get_format(const struct gen_device_info *devinfo, VkFormat vk_format, format.isl_format = rgbx; } else { format.isl_format = isl_format_rgb_to_rgba(format.isl_format); - format.swizzle = (struct anv_format_swizzle) RGB1; + format.swizzle = RGB1; } } diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index af6b4ca8511..63b8c86f5c3 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -345,7 +345,7 @@ alloc_surface_state(struct anv_device *device, static enum isl_channel_select remap_swizzle(VkComponentSwizzle swizzle, VkComponentSwizzle component, - struct anv_format_swizzle format_swizzle) + struct isl_swizzle format_swizzle) { if (swizzle == VK_COMPONENT_SWIZZLE_IDENTITY) swizzle = component; @@ -414,15 +414,15 @@ anv_image_view_init(struct anv_image_view *iview, .levels = anv_get_levelCount(image, range), .base_array_layer = range->baseArrayLayer, .array_len = anv_get_layerCount(image, range), - .channel_select = { - remap_swizzle(pCreateInfo->components.r, - VK_COMPONENT_SWIZZLE_R, format.swizzle), - remap_swizzle(pCreateInfo->components.g, - VK_COMPONENT_SWIZZLE_G, format.swizzle), - remap_swizzle(pCreateInfo->components.b, - VK_COMPONENT_SWIZZLE_B, format.swizzle), - remap_swizzle(pCreateInfo->components.a, - VK_COMPONENT_SWIZZLE_A, format.swizzle), + .swizzle = { + .r = remap_swizzle(pCreateInfo->components.r, + VK_COMPONENT_SWIZZLE_R, format.swizzle), + .g = remap_swizzle(pCreateInfo->components.g, + VK_COMPONENT_SWIZZLE_G, format.swizzle), + .b = remap_swizzle(pCreateInfo->components.b, + VK_COMPONENT_SWIZZLE_B, format.swizzle), + .a = remap_swizzle(pCreateInfo->components.a, + VK_COMPONENT_SWIZZLE_A, format.swizzle), }, }; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 99b3acf1a6a..f32806ca299 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1621,16 +1621,9 @@ anv_graphics_pipeline_create(VkDevice device, const VkAllocationCallbacks *alloc, VkPipeline *pPipeline); -struct anv_format_swizzle { - enum isl_channel_select r:4; - enum isl_channel_select g:4; - enum isl_channel_select b:4; - enum isl_channel_select a:4; -}; - struct anv_format { enum isl_format isl_format:16; - struct anv_format_swizzle swizzle; + struct isl_swizzle swizzle; }; struct anv_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 89d76c13bdd..3068c84ca18 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -217,12 +217,7 @@ brw_update_renderbuffer_surface(struct brw_context *brw, .levels = 1, .base_array_layer = irb->mt_layer / layer_multiplier, .array_len = MAX2(irb->layer_count, 1), - .channel_select = { - ISL_CHANNEL_SELECT_RED, - ISL_CHANNEL_SELECT_GREEN, - ISL_CHANNEL_SELECT_BLUE, - ISL_CHANNEL_SELECT_ALPHA, - }, + .swizzle = ISL_SWIZZLE_IDENTITY, .usage = ISL_SURF_USAGE_RENDER_TARGET_BIT, }; @@ -611,11 +606,11 @@ brw_update_texture_surface(struct gl_context *ctx, .levels = intel_obj->_MaxLevel - obj->BaseLevel + 1, .base_array_layer = obj->MinLayer, .array_len = view_num_layers, - .channel_select = { - swizzle_to_scs(GET_SWZ(swizzle, 0), need_green_to_blue), - swizzle_to_scs(GET_SWZ(swizzle, 1), need_green_to_blue), - swizzle_to_scs(GET_SWZ(swizzle, 2), need_green_to_blue), - swizzle_to_scs(GET_SWZ(swizzle, 3), need_green_to_blue), + .swizzle = { + .r = swizzle_to_scs(GET_SWZ(swizzle, 0), need_green_to_blue), + .g = swizzle_to_scs(GET_SWZ(swizzle, 1), need_green_to_blue), + .b = swizzle_to_scs(GET_SWZ(swizzle, 2), need_green_to_blue), + .a = swizzle_to_scs(GET_SWZ(swizzle, 3), need_green_to_blue), }, .usage = ISL_SURF_USAGE_TEXTURE_BIT, }; @@ -1189,12 +1184,7 @@ update_renderbuffer_read_surfaces(struct brw_context *brw) .levels = 1, .base_array_layer = irb->mt_layer / mt_layer_unit, .array_len = irb->layer_count, - .channel_select = { - ISL_CHANNEL_SELECT_RED, - ISL_CHANNEL_SELECT_GREEN, - ISL_CHANNEL_SELECT_BLUE, - ISL_CHANNEL_SELECT_ALPHA, - }, + .swizzle = ISL_SWIZZLE_IDENTITY, .usage = ISL_SURF_USAGE_TEXTURE_BIT, }; @@ -1748,12 +1738,7 @@ update_image_surface(struct brw_context *brw, .levels = 1, .base_array_layer = obj->MinLayer + u->_Layer, .array_len = num_layers, - .channel_select = { - ISL_CHANNEL_SELECT_RED, - ISL_CHANNEL_SELECT_GREEN, - ISL_CHANNEL_SELECT_BLUE, - ISL_CHANNEL_SELECT_ALPHA, - }, + .swizzle = ISL_SWIZZLE_IDENTITY, .usage = ISL_SURF_USAGE_STORAGE_BIT, }; -- 2.30.2