2 #include "util/u_inlines.h"
3 #include "util/u_memory.h"
4 #include "util/u_math.h"
6 #include "nouveau/nouveau_screen.h"
7 #include "nouveau/nouveau_winsys.h"
8 #include "nvfx_resource.h"
11 /* Currently using separate implementations for buffers and textures,
12 * even though gallium has a unified abstraction of these objects.
13 * Eventually these should be combined, and mechanisms like transfers
14 * be adapted to work for both buffer and texture uploads.
16 static void nvfx_buffer_destroy(struct pipe_screen
*pscreen
,
17 struct pipe_resource
*presource
)
19 struct nvfx_resource
*buffer
= nvfx_resource(presource
);
21 nouveau_screen_bo_release(pscreen
, buffer
->bo
);
28 /* Utility functions for transfer create/destroy are hooked in and
29 * just record the arguments to those functions.
32 nvfx_buffer_transfer_map( struct pipe_context
*pipe
,
33 struct pipe_transfer
*transfer
)
35 struct nvfx_resource
*buffer
= nvfx_resource(transfer
->resource
);
38 map
= nouveau_screen_bo_map_range( pipe
->screen
,
42 nouveau_screen_transfer_flags(transfer
->usage
) );
46 return map
+ transfer
->box
.x
;
51 static void nvfx_buffer_transfer_flush_region( struct pipe_context
*pipe
,
52 struct pipe_transfer
*transfer
,
53 const struct pipe_box
*box
)
55 struct nvfx_resource
*buffer
= nvfx_resource(transfer
->resource
);
57 nouveau_screen_bo_map_flush_range(pipe
->screen
,
59 transfer
->box
.x
+ box
->x
,
63 static void nvfx_buffer_transfer_unmap( struct pipe_context
*pipe
,
64 struct pipe_transfer
*transfer
)
66 struct nvfx_resource
*buffer
= nvfx_resource(transfer
->resource
);
68 nouveau_screen_bo_unmap(pipe
->screen
, buffer
->bo
);
74 struct u_resource_vtbl nvfx_buffer_vtbl
=
76 u_default_resource_get_handle
, /* get_handle */
77 nvfx_buffer_destroy
, /* resource_destroy */
78 NULL
, /* is_resource_referenced */
79 u_default_get_transfer
, /* get_transfer */
80 u_default_transfer_destroy
, /* transfer_destroy */
81 nvfx_buffer_transfer_map
, /* transfer_map */
82 nvfx_buffer_transfer_flush_region
, /* transfer_flush_region */
83 nvfx_buffer_transfer_unmap
, /* transfer_unmap */
84 u_default_transfer_inline_write
/* transfer_inline_write */
89 struct pipe_resource
*
90 nvfx_buffer_create(struct pipe_screen
*pscreen
,
91 const struct pipe_resource
*template)
93 struct nvfx_resource
*buffer
;
95 buffer
= CALLOC_STRUCT(nvfx_resource
);
99 buffer
->base
= *template;
100 buffer
->vtbl
= &nvfx_buffer_vtbl
;
101 pipe_reference_init(&buffer
->base
.reference
, 1);
102 buffer
->base
.screen
= pscreen
;
104 buffer
->bo
= nouveau_screen_bo_new(pscreen
,
108 buffer
->base
.width0
);
110 if (buffer
->bo
== NULL
)
113 return &buffer
->base
;
121 struct pipe_resource
*
122 nvfx_user_buffer_create(struct pipe_screen
*pscreen
,
127 struct nvfx_resource
*buffer
;
129 buffer
= CALLOC_STRUCT(nvfx_resource
);
133 pipe_reference_init(&buffer
->base
.reference
, 1);
134 buffer
->vtbl
= &nvfx_buffer_vtbl
;
135 buffer
->base
.screen
= pscreen
;
136 buffer
->base
.format
= PIPE_FORMAT_R8_UNORM
;
137 buffer
->base
.usage
= PIPE_USAGE_IMMUTABLE
;
138 buffer
->base
.bind
= usage
;
139 buffer
->base
.width0
= bytes
;
140 buffer
->base
.height0
= 1;
141 buffer
->base
.depth0
= 1;
143 buffer
->bo
= nouveau_screen_bo_user(pscreen
, ptr
, bytes
);
147 return &buffer
->base
;