nvc0: import nvc0 gallium driver
[mesa.git] / src / gallium / drivers / nvc0 / nvc0_resource.c
1
2 #include "pipe/p_context.h"
3 #include "nvc0_resource.h"
4 #include "nouveau/nouveau_screen.h"
5
6 static unsigned
7 nvc0_resource_is_referenced(struct pipe_context *pipe,
8 struct pipe_resource *resource,
9 unsigned face, unsigned level)
10 {
11 struct nvc0_resource *res = nvc0_resource(resource);
12 unsigned flags = 0;
13
14 #ifdef NOUVEAU_USERSPACE_MM
15 flags = res->status;
16 #else
17 unsigned bo_flags = nouveau_bo_pending(res->bo);
18 if (bo_flags & NOUVEAU_BO_RD)
19 flags = PIPE_REFERENCED_FOR_READ;
20 if (bo_flags & NOUVEAU_BO_WR)
21 flags |= PIPE_REFERENCED_FOR_WRITE;
22 #endif
23 return flags;
24 }
25
26 static struct pipe_resource *
27 nvc0_resource_create(struct pipe_screen *screen,
28 const struct pipe_resource *templ)
29 {
30 switch (templ->target) {
31 case PIPE_BUFFER:
32 return nvc0_buffer_create(screen, templ);
33 default:
34 return nvc0_miptree_create(screen, templ);
35 }
36 }
37
38 static struct pipe_resource *
39 nvc0_resource_from_handle(struct pipe_screen * screen,
40 const struct pipe_resource *templ,
41 struct winsys_handle *whandle)
42 {
43 if (templ->target == PIPE_BUFFER)
44 return NULL;
45 else
46 return nvc0_miptree_from_handle(screen, templ, whandle);
47 }
48
49 void
50 nvc0_init_resource_functions(struct pipe_context *pcontext)
51 {
52 pcontext->get_transfer = u_get_transfer_vtbl;
53 pcontext->transfer_map = u_transfer_map_vtbl;
54 pcontext->transfer_flush_region = u_transfer_flush_region_vtbl;
55 pcontext->transfer_unmap = u_transfer_unmap_vtbl;
56 pcontext->transfer_destroy = u_transfer_destroy_vtbl;
57 pcontext->transfer_inline_write = u_transfer_inline_write_vtbl;
58 pcontext->is_resource_referenced = nvc0_resource_is_referenced;
59 }
60
61 void
62 nvc0_screen_init_resource_functions(struct pipe_screen *pscreen)
63 {
64 pscreen->resource_create = nvc0_resource_create;
65 pscreen->resource_from_handle = nvc0_resource_from_handle;
66 pscreen->resource_get_handle = u_resource_get_handle_vtbl;
67 pscreen->resource_destroy = u_resource_destroy_vtbl;
68 pscreen->user_buffer_create = nvc0_user_buffer_create;
69 pscreen->get_tex_surface = nvc0_miptree_surface_new;
70 pscreen->tex_surface_destroy = nvc0_miptree_surface_del;
71 }