diff options
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_screen.c | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index f137e3ecf97..0c1a88d36f3 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -296,26 +296,25 @@ static struct intel_image_format intel_image_formats[] = { }; static const struct { - uint32_t tiling; uint64_t modifier; unsigned since_gen; -} tiling_modifier_map[] = { - { .tiling = I915_TILING_NONE, .modifier = DRM_FORMAT_MOD_LINEAR, - .since_gen = 1 }, - { .tiling = I915_TILING_X, .modifier = I915_FORMAT_MOD_X_TILED, - .since_gen = 1 }, - { .tiling = I915_TILING_Y, .modifier = I915_FORMAT_MOD_Y_TILED, - .since_gen = 6 }, +} supported_modifiers[] = { + { .modifier = DRM_FORMAT_MOD_LINEAR , .since_gen = 1 }, + { .modifier = I915_FORMAT_MOD_X_TILED , .since_gen = 1 }, + { .modifier = I915_FORMAT_MOD_Y_TILED , .since_gen = 6 }, }; static bool -modifier_is_supported(uint64_t modifier) +modifier_is_supported(const struct gen_device_info *devinfo, + uint64_t modifier) { int i; - for (i = 0; i < ARRAY_SIZE(tiling_modifier_map); i++) { - if (tiling_modifier_map[i].modifier == modifier) - return true; + for (i = 0; i < ARRAY_SIZE(supported_modifiers); i++) { + if (supported_modifiers[i].modifier != modifier) + continue; + + return supported_modifiers[i].since_gen <= devinfo->gen; } return false; @@ -324,14 +323,15 @@ modifier_is_supported(uint64_t modifier) static uint64_t tiling_to_modifier(uint32_t tiling) { - int i; + static const uint64_t map[] = { + [I915_TILING_NONE] = DRM_FORMAT_MOD_LINEAR, + [I915_TILING_X] = I915_FORMAT_MOD_X_TILED, + [I915_TILING_Y] = I915_FORMAT_MOD_Y_TILED, + }; - for (i = 0; i < ARRAY_SIZE(tiling_modifier_map); i++) { - if (tiling_modifier_map[i].tiling == tiling) - return tiling_modifier_map[i].modifier; - } + assert(tiling < ARRAY_SIZE(map)); - unreachable("tiling_to_modifier received unknown tiling mode"); + return map[tiling]; } static void @@ -860,8 +860,9 @@ intel_create_image_from_fds_common(__DRIscreen *dri_screen, if (f == NULL) return NULL; - if (modifier != DRM_FORMAT_MOD_INVALID && !modifier_is_supported(modifier)) - return NULL; + if (modifier != DRM_FORMAT_MOD_INVALID && + !modifier_is_supported(&screen->devinfo, modifier)) + return NULL; if (f->nplanes == 1) image = intel_allocate_image(screen, f->planes[0].dri_format, @@ -1074,15 +1075,16 @@ intel_query_dma_buf_modifiers(__DRIscreen *_screen, int fourcc, int max, if (f == NULL) return false; - for (i = 0; i < ARRAY_SIZE(tiling_modifier_map); i++) { - if (screen->devinfo.gen < tiling_modifier_map[i].since_gen) + for (i = 0; i < ARRAY_SIZE(supported_modifiers); i++) { + uint64_t modifier = supported_modifiers[i].modifier; + if (!modifier_is_supported(&screen->devinfo, modifier)) continue; num_mods++; if (max == 0) continue; - modifiers[num_mods - 1] = tiling_modifier_map[i].modifier; + modifiers[num_mods - 1] = modifier; if (num_mods >= max) break; } |