1
/**************************************************************************
3
* Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
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:
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
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 TUNGSTEN GRAPHICS 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.
26
**************************************************************************/
29
* Keith Whitwell <keith@tungstengraphics.com>
30
* Michel Dänzer <michel@tungstengraphics.com>
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"
39
#include "i915_context.h"
40
#include "i915_resource.h"
45
i915_buffer_get_handle(struct pipe_screen *screen,
46
struct pipe_resource *resource,
47
struct winsys_handle *handle)
53
i915_buffer_destroy(struct pipe_screen *screen,
54
struct pipe_resource *resource)
56
struct i915_buffer *buffer = i915_buffer(resource);
57
if (buffer->free_on_destroy)
58
align_free(buffer->data);
64
i915_buffer_transfer_map( struct pipe_context *pipe,
65
struct pipe_transfer *transfer )
67
struct i915_buffer *buffer = i915_buffer(transfer->resource);
68
return buffer->data + transfer->box.x;
73
i915_buffer_transfer_inline_write( struct pipe_context *rm_ctx,
74
struct pipe_resource *resource,
75
struct pipe_subresource sr,
77
const struct pipe_box *box,
80
unsigned slice_stride)
82
struct i915_buffer *buffer = i915_buffer(resource);
84
memcpy(buffer->data + box->x,
90
struct u_resource_vtbl i915_buffer_vtbl =
92
i915_buffer_get_handle, /* get_handle */
93
i915_buffer_destroy, /* resource_destroy */
94
NULL, /* is_resource_referenced */
95
u_default_get_transfer, /* get_transfer */
96
u_default_transfer_destroy, /* transfer_destroy */
97
i915_buffer_transfer_map, /* transfer_map */
98
u_default_transfer_flush_region, /* transfer_flush_region */
99
u_default_transfer_unmap, /* transfer_unmap */
100
i915_buffer_transfer_inline_write /* transfer_inline_write */
105
struct pipe_resource *
106
i915_buffer_create(struct pipe_screen *screen,
107
const struct pipe_resource *template)
109
struct i915_buffer *buf = CALLOC_STRUCT(i915_buffer);
114
buf->b.b = *template;
115
buf->b.vtbl = &i915_buffer_vtbl;
116
pipe_reference_init(&buf->b.b.reference, 1);
117
buf->b.b.screen = screen;
119
buf->data = MALLOC(template->width0);
120
buf->free_on_destroy = TRUE;
134
struct pipe_resource *
135
i915_user_buffer_create(struct pipe_screen *screen,
140
struct i915_buffer *buf = CALLOC_STRUCT(i915_buffer);
145
pipe_reference_init(&buf->b.b.reference, 1);
146
buf->b.vtbl = &i915_buffer_vtbl;
147
buf->b.b.screen = screen;
148
buf->b.b.format = PIPE_FORMAT_R8_UNORM; /* ?? */
149
buf->b.b.usage = PIPE_USAGE_IMMUTABLE;
150
buf->b.b.bind = bind;
152
buf->b.b.width0 = bytes;
153
buf->b.b.height0 = 1;
157
buf->free_on_destroy = FALSE;