unsigned usage)
{
if(screen->buffer_map_range) {
- struct pipe_buffer_range read;
- struct pipe_buffer_range write;
- read.offset = 0;
- read.size = usage & PIPE_BUFFER_USAGE_CPU_READ ? buf->size : 0;
- write.offset = 0;
- write.size = usage & PIPE_BUFFER_USAGE_CPU_WRITE ? buf->size : 0;
- return screen->buffer_map_range(screen, buf, read, write, usage);
+ unsigned offset = 0;
+ unsigned length = buf->size;
+ return screen->buffer_map_range(screen, buf, offset, length, usage);
}
else
return screen->buffer_map(screen, buf, usage);
pipe_buffer_unmap(struct pipe_screen *screen,
struct pipe_buffer *buf)
{
- if(screen->buffer_unmap_range) {
- struct pipe_buffer_range written;
- written.offset = 0;
- written.size = buf->size;
- screen->buffer_unmap_range(screen, buf, written);
- }
- else
- screen->buffer_unmap(screen, buf);
+ screen->buffer_unmap(screen, buf);
}
static INLINE void *
pipe_buffer_map_range(struct pipe_screen *screen,
struct pipe_buffer *buf,
- struct pipe_buffer_range read,
- struct pipe_buffer_range write)
+ unsigned offset,
+ unsigned length,
+ unsigned usage)
{
- unsigned usage = 0;
- if(read.size)
- usage |= PIPE_BUFFER_USAGE_CPU_READ;
- if(write.size)
- usage |= PIPE_BUFFER_USAGE_CPU_WRITE;
if(screen->buffer_map_range)
- return screen->buffer_map_range(screen, buf, read, write, usage);
- else
- return screen->buffer_map(screen, buf, usage);
+ return screen->buffer_map_range(screen, buf, offset, length, usage);
+ else {
+ uint8_t *map;
+ map = screen->buffer_map(screen, buf, usage);
+ return map ? map + offset : NULL;
+ }
}
static INLINE void
-pipe_buffer_unmap_range(struct pipe_screen *screen,
- struct pipe_buffer *buf,
- struct pipe_buffer_range written)
+pipe_buffer_flush_mapped_range(struct pipe_screen *screen,
+ struct pipe_buffer *buf,
+ unsigned offset,
+ unsigned length)
{
- if(screen->buffer_unmap_range)
- screen->buffer_unmap_range(screen, buf, written);
- else
- screen->buffer_unmap(screen, buf);
+ if(screen->buffer_flush_mapped_range)
+ screen->buffer_flush_mapped_range(screen, buf, offset, length);
}
static INLINE void
unsigned offset, unsigned size,
const void *data)
{
- struct pipe_buffer_range read;
- struct pipe_buffer_range write;
uint8_t *map;
assert(offset < buf->size);
assert(offset + size <= buf->size);
- read.offset = 0;
- read.size = 0;
- write.offset = offset;
- write.size = size;
-
- map = pipe_buffer_map_range(screen, buf, read, write);
+ map = pipe_buffer_map_range(screen, buf, offset, size, PIPE_BUFFER_USAGE_CPU_WRITE);
assert(map);
if(map) {
- memcpy(map + offset, data, size);
- pipe_buffer_unmap_range(screen, buf, write);
+ memcpy(map, data, size);
+ pipe_buffer_flush_mapped_range(screen, buf, offset, size);
+ pipe_buffer_unmap(screen, buf);
}
}
unsigned offset, unsigned size,
void *data)
{
- struct pipe_buffer_range read;
- struct pipe_buffer_range write;
uint8_t *map;
assert(offset < buf->size);
assert(offset + size <= buf->size);
- read.offset = offset;
- read.size = size;
- write.offset = 0;
- write.size = 0;
-
- map = pipe_buffer_map_range(screen, buf, read, write);
+ map = pipe_buffer_map_range(screen, buf, offset, size, PIPE_BUFFER_USAGE_CPU_READ);
assert(map);
if(map) {
- memcpy(data, map + offset, size);
- pipe_buffer_unmap_range(screen, buf, write);
+ memcpy(data, map, size);
+ pipe_buffer_unmap(screen, buf);
}
}
-struct pipe_buffer_range
-{
- unsigned offset;
- unsigned size;
-};
-
-
/**
* Gallium screen/adapter context. Basically everything
* hardware-specific that doesn't actually require a rendering
void *(*buffer_map)( struct pipe_screen *screen,
struct pipe_buffer *buf,
unsigned usage );
-
- void (*buffer_unmap)( struct pipe_screen *screen,
- struct pipe_buffer *buf );
-
/**
* Map a subrange of the buffer data store into the client's address space.
*
*/
void *(*buffer_map_range)( struct pipe_screen *screen,
struct pipe_buffer *buf,
- struct pipe_buffer_range read,
- struct pipe_buffer_range write,
- unsigned usage /* XXX: deprecated? */);
+ unsigned offset,
+ unsigned length,
+ unsigned usage);
/**
- * Unmap a buffer.
- *
* written is the range that the client actually wrote.
*/
- void (*buffer_unmap_range)( struct pipe_screen *screen,
- struct pipe_buffer *buf,
- struct pipe_buffer_range written);
+ void (*buffer_flush_mapped_range)( struct pipe_screen *screen,
+ struct pipe_buffer *buf,
+ unsigned offset,
+ unsigned length);
+
+ void (*buffer_unmap)( struct pipe_screen *screen,
+ struct pipe_buffer *buf );
void (*buffer_destroy)( struct pipe_screen *screen,
struct pipe_buffer *buf );