2 #include "util/u_inlines.h"
3 #include "util/u_memory.h"
4 #include "util/u_math.h"
7 #include "nouveau/nouveau_screen.h"
8 #include "nouveau/nouveau_winsys.h"
11 #include "nvc0_context.h"
12 #include "nvc0_resource.h"
15 nvc0_buffer_destroy(struct pipe_screen
*pscreen
,
16 struct pipe_resource
*presource
)
18 struct nvc0_resource
*res
= nvc0_resource(presource
);
21 nouveau_screen_bo_release(pscreen
, res
->bo
);
30 nvc0_buffer_transfer_map(struct pipe_context
*pipe
,
31 struct pipe_transfer
*transfer
)
33 struct nvc0_resource
*res
= nvc0_resource(transfer
->resource
);
37 if (res
->base
.bind
& PIPE_BIND_VERTEX_BUFFER
)
38 nvc0_context(pipe
)->vbo_dirty
= TRUE
;
40 // #ifdef NOUVEAU_USERPSACE_MM
41 if (res
->base
.bind
& PIPE_BIND_CONSTANT_BUFFER
)
42 return res
->data
+ transfer
->box
.x
;
44 flags
= nouveau_screen_transfer_flags(transfer
->usage
);
46 map
= nouveau_screen_bo_map_range(pipe
->screen
,
48 transfer
->box
.x
, transfer
->box
.width
,
53 return map
+ transfer
->box
.x
;
59 nvc0_buffer_transfer_flush_region(struct pipe_context
*pipe
,
60 struct pipe_transfer
*transfer
,
61 const struct pipe_box
*box
)
63 struct nvc0_resource
*res
= nvc0_resource(transfer
->resource
);
65 #ifdef NOUVEAU_USERPSACE_MM
69 nouveau_screen_bo_map_flush_range(pipe
->screen
,
71 transfer
->box
.x
+ box
->x
,
76 nvc0_buffer_transfer_unmap(struct pipe_context
*pipe
,
77 struct pipe_transfer
*transfer
)
79 struct nvc0_resource
*res
= nvc0_resource(transfer
->resource
);
81 // #ifdef NOUVEAU_USERPSACE_MM
85 nouveau_screen_bo_unmap(pipe
->screen
, res
->bo
);
88 const struct u_resource_vtbl nvc0_buffer_vtbl
=
90 u_default_resource_get_handle
, /* get_handle */
91 nvc0_buffer_destroy
, /* resource_destroy */
92 NULL
, /* is_resource_referenced */
93 u_default_get_transfer
, /* get_transfer */
94 u_default_transfer_destroy
, /* transfer_destroy */
95 nvc0_buffer_transfer_map
, /* transfer_map */
96 nvc0_buffer_transfer_flush_region
, /* transfer_flush_region */
97 nvc0_buffer_transfer_unmap
, /* transfer_unmap */
98 u_default_transfer_inline_write
/* transfer_inline_write */
101 struct pipe_resource
*
102 nvc0_buffer_create(struct pipe_screen
*pscreen
,
103 const struct pipe_resource
*templ
)
105 struct nvc0_resource
*buffer
;
107 buffer
= CALLOC_STRUCT(nvc0_resource
);
111 buffer
->base
= *templ
;
112 buffer
->vtbl
= &nvc0_buffer_vtbl
;
113 pipe_reference_init(&buffer
->base
.reference
, 1);
114 buffer
->base
.screen
= pscreen
;
116 if (buffer
->base
.bind
& PIPE_BIND_CONSTANT_BUFFER
)
117 buffer
->data
= MALLOC(buffer
->base
.width0
);
119 buffer
->bo
= nouveau_screen_bo_new(pscreen
,
123 buffer
->base
.width0
);
124 if (buffer
->bo
== NULL
)
127 return &buffer
->base
;
135 struct pipe_resource
*
136 nvc0_user_buffer_create(struct pipe_screen
*pscreen
,
141 struct nvc0_resource
*buffer
;
143 buffer
= CALLOC_STRUCT(nvc0_resource
);
147 pipe_reference_init(&buffer
->base
.reference
, 1);
148 buffer
->vtbl
= &nvc0_buffer_vtbl
;
149 buffer
->base
.screen
= pscreen
;
150 buffer
->base
.format
= PIPE_FORMAT_R8_UNORM
;
151 buffer
->base
.usage
= PIPE_USAGE_IMMUTABLE
;
152 buffer
->base
.bind
= bind
;
153 buffer
->base
.width0
= bytes
;
154 buffer
->base
.height0
= 1;
155 buffer
->base
.depth0
= 1;
157 buffer
->bo
= nouveau_screen_bo_user(pscreen
, ptr
, bytes
);
161 return &buffer
->base
;