Revert https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4580
[mesa.git] / src / gallium / drivers / nouveau / nvc0 / nvc0_resource.c
1 #include "drm-uapi/drm_fourcc.h"
2
3 #include "pipe/p_context.h"
4 #include "nvc0/nvc0_resource.h"
5 #include "nouveau_screen.h"
6
7
8 static struct pipe_resource *
9 nvc0_resource_create(struct pipe_screen *screen,
10 const struct pipe_resource *templ)
11 {
12 const uint64_t modifier = DRM_FORMAT_MOD_INVALID;
13
14 switch (templ->target) {
15 case PIPE_BUFFER:
16 return nouveau_buffer_create(screen, templ);
17 default:
18 return nvc0_miptree_create(screen, templ, &modifier, 1);
19 }
20 }
21
22 static struct pipe_resource *
23 nvc0_resource_create_with_modifiers(struct pipe_screen *screen,
24 const struct pipe_resource *templ,
25 const uint64_t *modifiers, int count)
26 {
27 switch (templ->target) {
28 case PIPE_BUFFER:
29 return nouveau_buffer_create(screen, templ);
30 default:
31 return nvc0_miptree_create(screen, templ, modifiers, count);
32 }
33 }
34
35 static void
36 nvc0_query_dmabuf_modifiers(struct pipe_screen *screen,
37 enum pipe_format format, int max,
38 uint64_t *modifiers, unsigned int *external_only,
39 int *count)
40 {
41 static const uint64_t supported_modifiers[] = {
42 DRM_FORMAT_MOD_LINEAR,
43 DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB,
44 DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB,
45 DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB,
46 DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB,
47 DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB,
48 DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB,
49 };
50 int i, num = 0;
51
52 if (max > ARRAY_SIZE(supported_modifiers))
53 max = ARRAY_SIZE(supported_modifiers);
54
55 if (!max) {
56 max = ARRAY_SIZE(supported_modifiers);
57 external_only = NULL;
58 modifiers = NULL;
59 }
60
61 for (i = 0; i < max; i++) {
62 if (modifiers)
63 modifiers[num] = supported_modifiers[i];
64
65 if (external_only)
66 external_only[num] = 0;
67
68 num++;
69 }
70
71 *count = num;
72 }
73
74 static struct pipe_resource *
75 nvc0_resource_from_handle(struct pipe_screen * screen,
76 const struct pipe_resource *templ,
77 struct winsys_handle *whandle,
78 unsigned usage)
79 {
80 if (templ->target == PIPE_BUFFER) {
81 return NULL;
82 } else {
83 struct pipe_resource *res = nv50_miptree_from_handle(screen,
84 templ, whandle);
85 if (res)
86 nv04_resource(res)->vtbl = &nvc0_miptree_vtbl;
87 return res;
88 }
89 }
90
91 static struct pipe_surface *
92 nvc0_surface_create(struct pipe_context *pipe,
93 struct pipe_resource *pres,
94 const struct pipe_surface *templ)
95 {
96 if (unlikely(pres->target == PIPE_BUFFER))
97 return nv50_surface_from_buffer(pipe, pres, templ);
98 return nvc0_miptree_surface_new(pipe, pres, templ);
99 }
100
101 void
102 nvc0_init_resource_functions(struct pipe_context *pcontext)
103 {
104 pcontext->transfer_map = u_transfer_map_vtbl;
105 pcontext->transfer_flush_region = u_transfer_flush_region_vtbl;
106 pcontext->transfer_unmap = u_transfer_unmap_vtbl;
107 pcontext->buffer_subdata = u_default_buffer_subdata;
108 pcontext->texture_subdata = u_default_texture_subdata;
109 pcontext->create_surface = nvc0_surface_create;
110 pcontext->surface_destroy = nv50_surface_destroy;
111 pcontext->invalidate_resource = nv50_invalidate_resource;
112 }
113
114 void
115 nvc0_screen_init_resource_functions(struct pipe_screen *pscreen)
116 {
117 pscreen->resource_create = nvc0_resource_create;
118 pscreen->resource_create_with_modifiers = nvc0_resource_create_with_modifiers;
119 pscreen->query_dmabuf_modifiers = nvc0_query_dmabuf_modifiers;
120 pscreen->resource_from_handle = nvc0_resource_from_handle;
121 pscreen->resource_get_handle = u_resource_get_handle_vtbl;
122 pscreen->resource_destroy = u_resource_destroy_vtbl;
123 }