1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h"
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_resource.h"
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau/nouveau_screen.h"
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource *
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_resource_create(struct pipe_screen *screen,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const struct pipe_resource *templ)
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (templ->target) {
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_BUFFER:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return nouveau_buffer_create(screen, templ);
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return nvc0_miptree_create(screen, templ);
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource *
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_resource_from_handle(struct pipe_screen * screen,
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          const struct pipe_resource *templ,
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct winsys_handle *whandle)
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (templ->target == PIPE_BUFFER) {
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_resource *res = nv50_miptree_from_handle(screen,
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                           templ, whandle);
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nv04_resource(res)->vtbl = &nvc0_miptree_vtbl;
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return res;
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_surface *
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_surface_create(struct pipe_context *pipe,
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    struct pipe_resource *pres,
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    const struct pipe_surface *templ)
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(pres->target == PIPE_BUFFER))
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return nv50_surface_from_buffer(pipe, pres, templ);
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return nvc0_miptree_surface_new(pipe, pres, templ);
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_init_resource_functions(struct pipe_context *pcontext)
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pcontext->get_transfer = u_get_transfer_vtbl;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pcontext->transfer_map = u_transfer_map_vtbl;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pcontext->transfer_flush_region = u_transfer_flush_region_vtbl;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pcontext->transfer_unmap = u_transfer_unmap_vtbl;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pcontext->transfer_destroy = u_transfer_destroy_vtbl;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pcontext->transfer_inline_write = u_transfer_inline_write_vtbl;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pcontext->create_surface = nvc0_surface_create;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pcontext->surface_destroy = nv50_surface_destroy;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_screen_init_resource_functions(struct pipe_screen *pscreen)
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pscreen->resource_create = nvc0_resource_create;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pscreen->resource_from_handle = nvc0_resource_from_handle;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pscreen->resource_get_handle = u_resource_get_handle_vtbl;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pscreen->resource_destroy = u_resource_destroy_vtbl;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
65