u_transfer.c 2.35 KB
Newer Older
1 2 3 4
#include "pipe/p_context.h"
#include "util/u_rect.h"
#include "util/u_inlines.h"
#include "util/u_transfer.h"
5
#include "util/u_memory.h"
6 7 8 9

/* One-shot transfer operation with data supplied in a user
 * pointer.  XXX: strides??
 */
10 11 12
void u_default_transfer_inline_write( struct pipe_context *pipe,
				      struct pipe_resource *resource,
				      struct pipe_subresource sr,
13
				      unsigned usage,
14 15 16 17
				      const struct pipe_box *box,
				      const void *data,
				      unsigned stride,
				      unsigned slice_stride)
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
{
   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);
}


Keith Whitwell's avatar
Keith Whitwell committed
55 56 57 58 59 60
boolean u_default_resource_get_handle(struct pipe_screen *screen,
				      struct pipe_resource *resource,
				      struct winsys_handle *handle)
{
   return FALSE;
}
61 62


63

64 65 66
void u_default_transfer_flush_region( struct pipe_context *pipe,
				      struct pipe_transfer *transfer,
				      const struct pipe_box *box)
67 68 69 70
{
   /* This is a no-op implementation, nothing to do.
    */
}
71

72 73 74 75 76 77 78
unsigned u_default_is_resource_referenced( struct pipe_context *pipe,
					   struct pipe_resource *resource,
					unsigned face, unsigned level)
{
   return 0;
}

79 80 81
struct pipe_transfer * u_default_get_transfer(struct pipe_context *context,
					      struct pipe_resource *resource,
					      struct pipe_subresource sr,
82
					      unsigned usage,
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
					      const struct pipe_box *box)
{
   struct pipe_transfer *transfer = CALLOC_STRUCT(pipe_transfer);
   if (transfer == NULL)
      return NULL;

   transfer->resource = resource;
   transfer->sr = sr;
   transfer->usage = usage;
   transfer->box = *box;
   return transfer;
}

void u_default_transfer_unmap( struct pipe_context *pipe,
			      struct pipe_transfer *transfer )
{
}

void u_default_transfer_destroy(struct pipe_context *pipe,
				struct pipe_transfer *transfer)
{
   FREE(transfer);
}