diff options
-rw-r--r-- | src/gallium/drivers/nouveau/Android.mk | 3 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/Makefile.am | 1 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/meson.build | 4 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c | 81 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nvc0/nvc0_resource.c | 59 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nvc0/nvc0_resource.h | 3 |
6 files changed, 146 insertions, 5 deletions
diff --git a/src/gallium/drivers/nouveau/Android.mk b/src/gallium/drivers/nouveau/Android.mk index 2de22e73ec1..a446774a86e 100644 --- a/src/gallium/drivers/nouveau/Android.mk +++ b/src/gallium/drivers/nouveau/Android.mk @@ -36,6 +36,9 @@ LOCAL_SRC_FILES := \ $(NVC0_CODEGEN_SOURCES) \ $(NVC0_C_SOURCES) +LOCAL_C_INCLUDES := \ + $(MESA_TOP)/include/drm-uapi + LOCAL_SHARED_LIBRARIES := libdrm_nouveau LOCAL_MODULE := libmesa_pipe_nouveau diff --git a/src/gallium/drivers/nouveau/Makefile.am b/src/gallium/drivers/nouveau/Makefile.am index 91547178e39..f6126b54481 100644 --- a/src/gallium/drivers/nouveau/Makefile.am +++ b/src/gallium/drivers/nouveau/Makefile.am @@ -24,6 +24,7 @@ include Makefile.sources include $(top_srcdir)/src/gallium/Automake.inc AM_CPPFLAGS = \ + -I$(top_srcdir)/include/drm-uapi \ $(GALLIUM_DRIVER_CFLAGS) \ $(LIBDRM_CFLAGS) \ $(NOUVEAU_CFLAGS) diff --git a/src/gallium/drivers/nouveau/meson.build b/src/gallium/drivers/nouveau/meson.build index e44be2616e7..242ee0e0001 100644 --- a/src/gallium/drivers/nouveau/meson.build +++ b/src/gallium/drivers/nouveau/meson.build @@ -207,7 +207,9 @@ files_libnouveau = files( libnouveau = static_library( 'nouveau', [files_libnouveau], - include_directories : [inc_src, inc_include, inc_gallium, inc_gallium_aux], + include_directories : [ + inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_drm_uapi + ], c_args : [c_vis_args], cpp_args : [cpp_vis_args], dependencies : [dep_libdrm, dep_libdrm_nouveau], diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c index 27674f72a7c..7983c403087 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c @@ -20,8 +20,11 @@ * OTHER DEALINGS IN THE SOFTWARE. */ +#include <drm_fourcc.h> + #include "pipe/p_state.h" #include "pipe/p_defines.h" +#include "state_tracker/drm_driver.h" #include "util/u_inlines.h" #include "util/u_format.h" @@ -233,9 +236,79 @@ nvc0_miptree_init_layout_tiled(struct nv50_miptree *mt) } } +static uint64_t nvc0_miptree_get_modifier(struct nv50_miptree *mt) +{ + union nouveau_bo_config *config = &mt->base.bo->config; + uint64_t modifier; + + if (mt->layout_3d) + return DRM_FORMAT_MOD_INVALID; + + switch (config->nvc0.memtype) { + case 0x00: + modifier = DRM_FORMAT_MOD_LINEAR; + break; + + case 0xfe: + switch (NVC0_TILE_MODE_Y(config->nvc0.tile_mode)) { + case 0: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB; + break; + + case 1: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB; + break; + + case 2: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB; + break; + + case 3: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB; + break; + + case 4: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB; + break; + + case 5: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB; + break; + + default: + modifier = DRM_FORMAT_MOD_INVALID; + break; + } + break; + + default: + modifier = DRM_FORMAT_MOD_INVALID; + break; + } + + return modifier; +} + +static boolean +nvc0_miptree_get_handle(struct pipe_screen *pscreen, + struct pipe_resource *pt, + struct winsys_handle *whandle) +{ + struct nv50_miptree *mt = nv50_miptree(pt); + boolean ret; + + ret = nv50_miptree_get_handle(pscreen, pt, whandle); + if (!ret) + return ret; + + whandle->modifier = nvc0_miptree_get_modifier(mt); + + return true; +} + const struct u_resource_vtbl nvc0_miptree_vtbl = { - nv50_miptree_get_handle, /* get_handle */ + nvc0_miptree_get_handle, /* get_handle */ nv50_miptree_destroy, /* resource_destroy */ nvc0_miptree_transfer_map, /* transfer_map */ u_default_transfer_flush_region, /* transfer_flush_region */ @@ -244,7 +317,8 @@ const struct u_resource_vtbl nvc0_miptree_vtbl = struct pipe_resource * nvc0_miptree_create(struct pipe_screen *pscreen, - const struct pipe_resource *templ) + const struct pipe_resource *templ, + const uint64_t *modifiers, unsigned int count) { struct nouveau_device *dev = nouveau_screen(pscreen)->device; struct nouveau_drm *drm = nouveau_screen(pscreen)->drm; @@ -277,6 +351,9 @@ nvc0_miptree_create(struct pipe_screen *pscreen, } } + if (count == 1 && modifiers[0] == DRM_FORMAT_MOD_LINEAR) + pt->flags |= NOUVEAU_RESOURCE_FLAG_LINEAR; + if (pt->bind & PIPE_BIND_LINEAR) pt->flags |= NOUVEAU_RESOURCE_FLAG_LINEAR; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c index 9bafe3d835d..ec6257a8963 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c @@ -1,3 +1,4 @@ +#include <drm_fourcc.h> #include "pipe/p_context.h" #include "nvc0/nvc0_resource.h" @@ -8,15 +9,69 @@ static struct pipe_resource * nvc0_resource_create(struct pipe_screen *screen, const struct pipe_resource *templ) { + const uint64_t modifier = DRM_FORMAT_MOD_INVALID; + switch (templ->target) { case PIPE_BUFFER: return nouveau_buffer_create(screen, templ); default: - return nvc0_miptree_create(screen, templ); + return nvc0_miptree_create(screen, templ, &modifier, 1); } } static struct pipe_resource * +nvc0_resource_create_with_modifiers(struct pipe_screen *screen, + const struct pipe_resource *templ, + const uint64_t *modifiers, int count) +{ + switch (templ->target) { + case PIPE_BUFFER: + return nouveau_buffer_create(screen, templ); + default: + return nvc0_miptree_create(screen, templ, modifiers, count); + } +} + +static void +nvc0_query_dmabuf_modifiers(struct pipe_screen *screen, + enum pipe_format format, int max, + uint64_t *modifiers, unsigned int *external_only, + int *count) +{ + static const uint64_t supported_modifiers[] = { + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB, + }; + int i, num = 0; + + if (max > ARRAY_SIZE(supported_modifiers)) + max = ARRAY_SIZE(supported_modifiers); + + if (!max) { + max = ARRAY_SIZE(supported_modifiers); + external_only = NULL; + modifiers = NULL; + } + + for (i = 0; i < max; i++) { + if (modifiers) + modifiers[num] = supported_modifiers[i]; + + if (external_only) + external_only[num] = 0; + + num++; + } + + *count = num; +} + +static struct pipe_resource * nvc0_resource_from_handle(struct pipe_screen * screen, const struct pipe_resource *templ, struct winsys_handle *whandle, @@ -60,6 +115,8 @@ void nvc0_screen_init_resource_functions(struct pipe_screen *pscreen) { pscreen->resource_create = nvc0_resource_create; + pscreen->resource_create_with_modifiers = nvc0_resource_create_with_modifiers; + pscreen->query_dmabuf_modifiers = nvc0_query_dmabuf_modifiers; pscreen->resource_from_handle = nvc0_resource_from_handle; pscreen->resource_get_handle = u_resource_get_handle_vtbl; pscreen->resource_destroy = u_resource_destroy_vtbl; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.h b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.h index c68a5094836..b24fca004ca 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.h +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.h @@ -35,7 +35,8 @@ nvc0_screen_init_resource_functions(struct pipe_screen *pscreen); */ struct pipe_resource * nvc0_miptree_create(struct pipe_screen *pscreen, - const struct pipe_resource *tmp); + const struct pipe_resource *tmp, + const uint64_t *modifiers, unsigned int count); const struct u_resource_vtbl nvc0_miptree_vtbl; |