Browse Source

util: helpers for inline transfers

gallium-buffer-usage-cleanup
Keith Whitwell 16 years ago
parent
commit
072957aab2

+ 2
- 1
src/gallium/auxiliary/Makefile View File

@@ -127,14 +127,15 @@ C_SOURCES = \
util/u_surface.c \
util/u_texture.c \
util/u_tile.c \
util/u_transfer.c \
util/u_upload_mgr.c \
target-helpers/wrap_screen.c
# Disabling until pipe-video branch gets merged in
#vl/vl_bitstream_parser.c \
#vl/vl_mpeg12_mc_renderer.c \
#vl/vl_compositor.c \
#vl/vl_csc.c \
#vl/vl_shader_build.c \
target-helpers/wrap_screen.c

GALLIVM_SOURCES = \
gallivm/lp_bld_alpha.c \

+ 98
- 0
src/gallium/auxiliary/util/u_transfer.c View File

@@ -0,0 +1,98 @@
#include "pipe/p_context.h"
#include "util/u_rect.h"
#include "util/u_inlines.h"
#include "util/u_transfer.h"

/* One-shot transfer operation with data supplied in a user
* pointer. XXX: strides??
*/
void u_transfer_inline_write( struct pipe_context *pipe,
struct pipe_resource *resource,
struct pipe_subresource sr,
enum pipe_transfer_usage usage,
const struct pipe_box *box,
const void *data )
{
struct pipe_transfer *transfer = NULL;
uint8_t *map = NULL;

transfer = pipe->get_transfer(pipe,
resource,
sr,
usage,
box );
if (transfer == NULL)
goto out;

map = pipe_transfer_map(pipe, transfer);
if (map == NULL)
goto out;

assert(box->depth == 1); /* XXX: fix me */
util_copy_rect(map,
resource->format,
transfer->stride, /* bytes? */
0, 0,
box->width,
box->height,
data,
box->width, /* bytes? texels? */
0, 0);

out:
if (map)
pipe_transfer_unmap(pipe, transfer);

if (transfer)
pipe_transfer_destroy(pipe, transfer);
}



/* One-shot read transfer operation with data returned in a user
* pointer. XXX: strides??
*/
void u_transfer_inline_read( struct pipe_context *pipe,
struct pipe_resource *resource,
struct pipe_subresource sr,
enum pipe_transfer_usage usage,
const struct pipe_box *box,
void *data )
{
struct pipe_transfer *transfer = NULL;
uint8_t *map = NULL;

transfer = pipe->get_transfer(pipe,
resource,
sr,
usage,
box );
if (transfer == NULL)
goto out;

map = pipe_transfer_map(pipe, transfer);
if (map == NULL)
goto out;

assert(box->depth == 1); /* XXX: fix me */
util_copy_rect(data,
resource->format,
transfer->stride, /* bytes? */
0, 0,
box->width,
box->height,
map,
box->width, /* bytes? texels? */
0, 0);


out:
if (map)
pipe_transfer_unmap(pipe, transfer);

if (transfer)
pipe_transfer_destroy(pipe, transfer);
}


+ 25
- 0
src/gallium/auxiliary/util/u_transfer.h View File

@@ -0,0 +1,25 @@

#ifndef U_TRANSFER_H
#define U_TRANSFER_H

/* Fallback implementations for inline read/writes which just go back
* to the regular transfer behaviour.
*/
#include "pipe/p_state.h"

struct pipe_context;


void u_transfer_inline_write( struct pipe_context *pipe,
struct pipe_resource *resource,
struct pipe_subresource sr,
enum pipe_transfer_usage usage,
const struct pipe_box *box,
const void *data );
void u_transfer_inline_read( struct pipe_context *pipe,
struct pipe_resource *resource,
struct pipe_subresource sr,
enum pipe_transfer_usage usage,
const struct pipe_box *box,
void *data );
#endif

Loading…
Cancel
Save