2 #include "pipe/p_context.h"
3 #include "util/u_inlines.h"
4 #include "util/u_format.h"
6 #include "nouveau/nouveau_screen.h"
8 #include "nv50_resource.h"
10 static struct pipe_resource
*
11 nv50_resource_create(struct pipe_screen
*screen
,
12 const struct pipe_resource
*templ
)
14 switch (templ
->target
) {
16 return nouveau_buffer_create(screen
, templ
);
18 return nv50_miptree_create(screen
, templ
);
22 static struct pipe_resource
*
23 nv50_resource_from_handle(struct pipe_screen
* screen
,
24 const struct pipe_resource
*templ
,
25 struct winsys_handle
*whandle
)
27 if (templ
->target
== PIPE_BUFFER
)
30 return nv50_miptree_from_handle(screen
, templ
, whandle
);
34 nv50_surface_from_buffer(struct pipe_context
*pipe
,
35 struct pipe_resource
*pbuf
,
36 const struct pipe_surface
*templ
)
38 struct nv50_surface
*sf
= CALLOC_STRUCT(nv50_surface
);
42 pipe_reference_init(&sf
->base
.reference
, 1);
43 pipe_resource_reference(&sf
->base
.texture
, pbuf
);
45 sf
->base
.format
= templ
->format
;
46 sf
->base
.u
.buf
.first_element
= templ
->u
.buf
.first_element
;
47 sf
->base
.u
.buf
.last_element
= templ
->u
.buf
.last_element
;
50 templ
->u
.buf
.first_element
* util_format_get_blocksize(sf
->base
.format
);
52 sf
->offset
&= ~0x7f; /* FIXME: RT_ADDRESS requires 128 byte alignment */
54 sf
->width
= templ
->u
.buf
.last_element
- templ
->u
.buf
.first_element
+ 1;
58 sf
->base
.width
= sf
->width
;
59 sf
->base
.height
= sf
->height
;
61 sf
->base
.context
= pipe
;
65 static struct pipe_surface
*
66 nv50_surface_create(struct pipe_context
*pipe
,
67 struct pipe_resource
*pres
,
68 const struct pipe_surface
*templ
)
70 if (unlikely(pres
->target
== PIPE_BUFFER
))
71 return nv50_surface_from_buffer(pipe
, pres
, templ
);
72 return nv50_miptree_surface_new(pipe
, pres
, templ
);
76 nv50_surface_destroy(struct pipe_context
*pipe
, struct pipe_surface
*ps
)
78 struct nv50_surface
*s
= nv50_surface(ps
);
80 pipe_resource_reference(&ps
->texture
, NULL
);
86 nv50_init_resource_functions(struct pipe_context
*pcontext
)
88 pcontext
->transfer_map
= u_transfer_map_vtbl
;
89 pcontext
->transfer_flush_region
= u_transfer_flush_region_vtbl
;
90 pcontext
->transfer_unmap
= u_transfer_unmap_vtbl
;
91 pcontext
->transfer_inline_write
= u_transfer_inline_write_vtbl
;
92 pcontext
->create_surface
= nv50_surface_create
;
93 pcontext
->surface_destroy
= nv50_surface_destroy
;
97 nv50_screen_init_resource_functions(struct pipe_screen
*pscreen
)
99 pscreen
->resource_create
= nv50_resource_create
;
100 pscreen
->resource_from_handle
= nv50_resource_from_handle
;
101 pscreen
->resource_get_handle
= u_resource_get_handle_vtbl
;
102 pscreen
->resource_destroy
= u_resource_destroy_vtbl
;