X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fetnaviv%2Fetnaviv_screen.c;h=0781fec5881415326dde6ff584420757fced8723;hp=9f1b44922ad2790cc8553e5b135799bac48458df;hb=c8a0660ab4d1c223de2bbfc578b3d7a03bf400c7;hpb=f8a39914586de004759ea9cbda1335bdf0790cdc diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c index 9f1b44922ad..0781fec5881 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c @@ -45,6 +45,8 @@ #include "state_tracker/drm_driver.h" +#include + #define ETNA_DRM_VERSION(major, minor) ((major) << 16 | (minor)) #define ETNA_DRM_VERSION_FENCE_FD ETNA_DRM_VERSION(1, 1) @@ -155,6 +157,7 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) return true; /* VIV_FEATURE(priv->dev, chipMinorFeatures1, NON_POWER_OF_TWO); */ + case PIPE_CAP_TEXTURE_SWIZZLE: case PIPE_CAP_PRIMITIVE_RESTART: return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0); @@ -164,7 +167,6 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) /* Unsupported features. */ case PIPE_CAP_SEAMLESS_CUBE_MAP: - case PIPE_CAP_TEXTURE_SWIZZLE: /* XXX supported on gc2000 */ case PIPE_CAP_COMPUTE: /* XXX supported on gc2000 */ case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: /* only one colorbuffer supported, so mixing makes no sense */ case PIPE_CAP_CONDITIONAL_RENDER: /* no occlusion queries */ @@ -255,6 +257,9 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_BALLOT: case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT: case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX: + case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: + case PIPE_CAP_POST_DEPTH_COVERAGE: + case PIPE_CAP_BINDLESS_TEXTURE: return 0; /* Stream output. */ @@ -342,6 +347,8 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) static float etna_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param) { + struct etna_screen *screen = etna_screen(pscreen); + switch (param) { case PIPE_CAPF_MAX_LINE_WIDTH: case PIPE_CAPF_MAX_LINE_WIDTH_AA: @@ -351,7 +358,7 @@ etna_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param) case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: return 16.0f; case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: - return 16.0f; + return util_last_bit(screen->specs.max_texture_size); case PIPE_CAPF_GUARD_BAND_LEFT: case PIPE_CAPF_GUARD_BAND_TOP: case PIPE_CAPF_GUARD_BAND_RIGHT: @@ -454,13 +461,25 @@ etna_screen_get_timestamp(struct pipe_screen *pscreen) } static bool -gpu_supports_texure_format(struct etna_screen *screen, uint32_t fmt) +gpu_supports_texure_format(struct etna_screen *screen, uint32_t fmt, + enum pipe_format format) { + bool supported = true; + if (fmt == TEXTURE_FORMAT_ETC1) - return VIV_FEATURE(screen, chipFeatures, ETC1_TEXTURE_COMPRESSION); + supported = VIV_FEATURE(screen, chipFeatures, ETC1_TEXTURE_COMPRESSION); if (fmt >= TEXTURE_FORMAT_DXT1 && fmt <= TEXTURE_FORMAT_DXT4_DXT5) - return VIV_FEATURE(screen, chipFeatures, DXT_TEXTURE_COMPRESSION); + supported = VIV_FEATURE(screen, chipFeatures, DXT_TEXTURE_COMPRESSION); + + if (fmt & EXT_FORMAT) + supported = VIV_FEATURE(screen, chipMinorFeatures1, HALTI0); + + if (!supported) + return false; + + if (texture_format_needs_swiz(format)) + return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0); return true; } @@ -506,7 +525,7 @@ etna_screen_is_format_supported(struct pipe_screen *pscreen, if (usage & PIPE_BIND_SAMPLER_VIEW) { uint32_t fmt = translate_texture_format(format); - if (!gpu_supports_texure_format(screen, fmt)) + if (!gpu_supports_texure_format(screen, fmt, format)) fmt = ETNA_NO_MATCH; if (sample_count < 2 && fmt != ETNA_NO_MATCH) @@ -540,6 +559,47 @@ etna_screen_is_format_supported(struct pipe_screen *pscreen, return usage == allowed; } +const uint64_t supported_modifiers[] = { + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_VIVANTE_TILED, + DRM_FORMAT_MOD_VIVANTE_SUPER_TILED, + DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED, + DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED, +}; + +static void +etna_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen, + enum pipe_format format, int max, + uint64_t *modifiers, + unsigned int *external_only, int *count) +{ + struct etna_screen *screen = etna_screen(pscreen); + int i, num_modifiers = 0; + + if (max > ARRAY_SIZE(supported_modifiers)) + max = ARRAY_SIZE(supported_modifiers); + + if (!max) { + modifiers = NULL; + max = ARRAY_SIZE(supported_modifiers); + } + + for (i = 0; num_modifiers < max; i++) { + /* don't advertise split tiled formats on single pipe/buffer GPUs */ + if ((screen->specs.pixel_pipes == 1 || screen->specs.single_buffer) && + i >= 3) + break; + + if (modifiers) + modifiers[num_modifiers] = supported_modifiers[i]; + if (external_only) + external_only[num_modifiers] = 0; + num_modifiers++; + } + + *count = num_modifiers; +} + static boolean etna_get_specs(struct etna_screen *screen) { @@ -621,7 +681,7 @@ etna_get_specs(struct etna_screen *screen) screen->model >= 0x1000 || screen->model == 0x880; screen->specs.npot_tex_any_wrap = VIV_FEATURE(screen, chipMinorFeatures1, NON_POWER_OF_TWO); - screen->specs.has_new_sin_cos = + screen->specs.has_new_transcendentals = VIV_FEATURE(screen, chipMinorFeatures3, HAS_FAST_TRANSCENDENTALS); if (VIV_FEATURE(screen, chipMinorFeatures3, INSTRUCTION_CACHE)) { @@ -691,25 +751,6 @@ fail: return false; } -boolean -etna_screen_bo_get_handle(struct pipe_screen *pscreen, struct etna_bo *bo, - unsigned stride, struct winsys_handle *whandle) -{ - whandle->stride = stride; - - if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) { - return etna_bo_get_name(bo, &whandle->handle) == 0; - } else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) { - whandle->handle = etna_bo_handle(bo); - return TRUE; - } else if (whandle->type == DRM_API_HANDLE_TYPE_FD) { - whandle->handle = etna_bo_dmabuf(bo); - return TRUE; - } else { - return FALSE; - } -} - struct etna_bo * etna_screen_bo_from_handle(struct pipe_screen *pscreen, struct winsys_handle *whandle, unsigned *out_stride) @@ -752,6 +793,7 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu, screen->dev = dev; screen->gpu = gpu; screen->ro = renderonly_dup(ro); + screen->refcnt = 1; if (!screen->ro) { DBG("could not create renderonly object"); @@ -853,6 +895,7 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu, pscreen->get_timestamp = etna_screen_get_timestamp; pscreen->context_create = etna_context_create; pscreen->is_format_supported = etna_screen_is_format_supported; + pscreen->query_dmabuf_modifiers = etna_screen_query_dmabuf_modifiers; etna_fence_screen_init(pscreen); etna_query_screen_init(pscreen);