1 /************************************************************************** 2 * 3 * Copyright 2006 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 /* 28 * Authors: 29 * Keith Whitwell <keithw (at) vmware.com> 30 * Michel Dnzer <daenzer (at) vmware.com> 31 */ 32 33 #include "pipe/p_context.h" 34 #include "pipe/p_defines.h" 35 #include "util/u_inlines.h" 36 #include "util/u_math.h" 37 #include "util/u_memory.h" 38 39 #include "i915_context.h" 40 #include "i915_resource.h" 41 42 43 44 static boolean 45 i915_buffer_get_handle(struct pipe_screen *screen, 46 struct pipe_resource *resource, 47 struct winsys_handle *handle) 48 { 49 return FALSE; 50 } 51 52 static void 53 i915_buffer_destroy(struct pipe_screen *screen, 54 struct pipe_resource *resource) 55 { 56 struct i915_buffer *buffer = i915_buffer(resource); 57 if (buffer->free_on_destroy) 58 align_free(buffer->data); 59 FREE(buffer); 60 } 61 62 63 static void * 64 i915_buffer_transfer_map(struct pipe_context *pipe, 65 struct pipe_resource *resource, 66 unsigned level, 67 unsigned usage, 68 const struct pipe_box *box, 69 struct pipe_transfer **ptransfer) 70 { 71 struct i915_context *i915 = i915_context(pipe); 72 struct i915_buffer *buffer = i915_buffer(resource); 73 struct pipe_transfer *transfer = slab_alloc_st(&i915->transfer_pool); 74 75 if (!transfer) 76 return NULL; 77 78 transfer->resource = resource; 79 transfer->level = level; 80 transfer->usage = usage; 81 transfer->box = *box; 82 *ptransfer = transfer; 83 84 return buffer->data + transfer->box.x; 85 } 86 87 static void 88 i915_buffer_transfer_unmap(struct pipe_context *pipe, 89 struct pipe_transfer *transfer) 90 { 91 struct i915_context *i915 = i915_context(pipe); 92 slab_free_st(&i915->transfer_pool, transfer); 93 } 94 95 void 96 i915_buffer_subdata(struct pipe_context *rm_ctx, 97 struct pipe_resource *resource, 98 unsigned usage, unsigned offset, 99 unsigned size, const void *data) 100 { 101 struct i915_buffer *buffer = i915_buffer(resource); 102 103 memcpy(buffer->data + offset, data, size); 104 } 105 106 107 struct u_resource_vtbl i915_buffer_vtbl = 108 { 109 i915_buffer_get_handle, /* get_handle */ 110 i915_buffer_destroy, /* resource_destroy */ 111 i915_buffer_transfer_map, /* transfer_map */ 112 u_default_transfer_flush_region, /* transfer_flush_region */ 113 i915_buffer_transfer_unmap, /* transfer_unmap */ 114 }; 115 116 117 118 struct pipe_resource * 119 i915_buffer_create(struct pipe_screen *screen, 120 const struct pipe_resource *template) 121 { 122 struct i915_buffer *buf = CALLOC_STRUCT(i915_buffer); 123 124 if (!buf) 125 return NULL; 126 127 buf->b.b = *template; 128 buf->b.vtbl = &i915_buffer_vtbl; 129 pipe_reference_init(&buf->b.b.reference, 1); 130 buf->b.b.screen = screen; 131 buf->data = align_malloc(template->width0, 64); 132 buf->free_on_destroy = TRUE; 133 134 if (!buf->data) 135 goto err; 136 137 return &buf->b.b; 138 139 err: 140 FREE(buf); 141 return NULL; 142 } 143 144 145 146 struct pipe_resource * 147 i915_user_buffer_create(struct pipe_screen *screen, 148 void *ptr, 149 unsigned bytes, 150 unsigned bind) 151 { 152 struct i915_buffer *buf = CALLOC_STRUCT(i915_buffer); 153 154 if (!buf) 155 return NULL; 156 157 pipe_reference_init(&buf->b.b.reference, 1); 158 buf->b.vtbl = &i915_buffer_vtbl; 159 buf->b.b.screen = screen; 160 buf->b.b.format = PIPE_FORMAT_R8_UNORM; /* ?? */ 161 buf->b.b.usage = PIPE_USAGE_IMMUTABLE; 162 buf->b.b.bind = bind; 163 buf->b.b.flags = 0; 164 buf->b.b.width0 = bytes; 165 buf->b.b.height0 = 1; 166 buf->b.b.depth0 = 1; 167 buf->b.b.array_size = 1; 168 169 buf->data = ptr; 170 buf->free_on_destroy = FALSE; 171 172 return &buf->b.b; 173 } 174