Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 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 
30
  *   Michel Dänzer 
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 = util_slab_alloc(&i915->transfer_pool);
74
 
75
   if (transfer == NULL)
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
   util_slab_free(&i915->transfer_pool, transfer);
93
}
94
 
95
static void
96
i915_buffer_transfer_inline_write( struct pipe_context *rm_ctx,
97
                                   struct pipe_resource *resource,
98
                                   unsigned level,
99
                                   unsigned usage,
100
                                   const struct pipe_box *box,
101
                                   const void *data,
102
                                   unsigned stride,
103
                                   unsigned layer_stride)
104
{
105
   struct i915_buffer *buffer = i915_buffer(resource);
106
 
107
   memcpy(buffer->data + box->x,
108
          data,
109
          box->width);
110
}
111
 
112
 
113
struct u_resource_vtbl i915_buffer_vtbl =
114
{
115
   i915_buffer_get_handle,	     /* get_handle */
116
   i915_buffer_destroy,		     /* resource_destroy */
117
   i915_buffer_transfer_map,	     /* transfer_map */
118
   u_default_transfer_flush_region,  /* transfer_flush_region */
119
   i915_buffer_transfer_unmap,	     /* transfer_unmap */
120
   i915_buffer_transfer_inline_write /* transfer_inline_write */
121
};
122
 
123
 
124
 
125
struct pipe_resource *
126
i915_buffer_create(struct pipe_screen *screen,
127
                    const struct pipe_resource *template)
128
{
129
   struct i915_buffer *buf = CALLOC_STRUCT(i915_buffer);
130
 
131
   if (!buf)
132
      return NULL;
133
 
134
   buf->b.b = *template;
135
   buf->b.vtbl = &i915_buffer_vtbl;
136
   pipe_reference_init(&buf->b.b.reference, 1);
137
   buf->b.b.screen = screen;
138
   buf->data = align_malloc(template->width0, 64);
139
   buf->free_on_destroy = TRUE;
140
 
141
   if (!buf->data)
142
      goto err;
143
 
144
   return &buf->b.b;
145
 
146
err:
147
   FREE(buf);
148
   return NULL;
149
}
150
 
151
 
152
 
153
struct pipe_resource *
154
i915_user_buffer_create(struct pipe_screen *screen,
155
                        void *ptr,
156
                        unsigned bytes,
157
                        unsigned bind)
158
{
159
   struct i915_buffer *buf = CALLOC_STRUCT(i915_buffer);
160
 
161
   if (!buf)
162
      return NULL;
163
 
164
   pipe_reference_init(&buf->b.b.reference, 1);
165
   buf->b.vtbl = &i915_buffer_vtbl;
166
   buf->b.b.screen = screen;
167
   buf->b.b.format = PIPE_FORMAT_R8_UNORM; /* ?? */
168
   buf->b.b.usage = PIPE_USAGE_IMMUTABLE;
169
   buf->b.b.bind = bind;
170
   buf->b.b.flags = 0;
171
   buf->b.b.width0 = bytes;
172
   buf->b.b.height0 = 1;
173
   buf->b.b.depth0 = 1;
174
   buf->b.b.array_size = 1;
175
 
176
   buf->data = ptr;
177
   buf->free_on_destroy = FALSE;
178
 
179
   return &buf->b.b;
180
}