$(NVC0_CODEGEN_SOURCES) \
$(NVC0_C_SOURCES)
+LOCAL_C_INCLUDES := \
+ $(MESA_TOP)/include/drm-uapi
+
LOCAL_SHARED_LIBRARIES := libdrm_nouveau
LOCAL_MODULE := libmesa_pipe_nouveau
include $(top_srcdir)/src/gallium/Automake.inc
AM_CPPFLAGS = \
+ -I$(top_srcdir)/include/drm-uapi \
$(GALLIUM_DRIVER_CFLAGS) \
$(LIBDRM_CFLAGS) \
$(NOUVEAU_CFLAGS)
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],
* 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"
}
}
+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 */
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;
}
}
+ 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;
+#include <drm_fourcc.h>
#include "pipe/p_context.h"
#include "nvc0/nvc0_resource.h"
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,
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;
*/
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;