Home | History | Annotate | Download | only in i915
      1 /**************************************************************************
      2  *
      3  * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
      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 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.
     25  *
     26  **************************************************************************/
     27  /*
     28   * Authors:
     29   *   Keith Whitwell <keith (at) tungstengraphics.com>
     30   *   Michel Dnzer <michel (at) tungstengraphics.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 struct pipe_transfer *
     64 i915_get_transfer(struct pipe_context *pipe,
     65                   struct pipe_resource *resource,
     66                   unsigned level,
     67                   unsigned usage,
     68                   const struct pipe_box *box)
     69 {
     70    struct i915_context *i915 = i915_context(pipe);
     71    struct pipe_transfer *transfer = util_slab_alloc(&i915->transfer_pool);
     72 
     73    if (transfer == NULL)
     74       return NULL;
     75 
     76    transfer->resource = resource;
     77    transfer->level = level;
     78    transfer->usage = usage;
     79    transfer->box = *box;
     80 
     81    /* Note strides are zero, this is ok for buffers, but not for
     82     * textures 2d & higher at least.
     83     */
     84    return transfer;
     85 }
     86 
     87 static void
     88 i915_transfer_destroy(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_map( struct pipe_context *pipe,
     97                           struct pipe_transfer *transfer )
     98 {
     99    struct i915_buffer *buffer = i915_buffer(transfer->resource);
    100    return buffer->data + transfer->box.x;
    101 }
    102 
    103 
    104 static void
    105 i915_buffer_transfer_inline_write( struct pipe_context *rm_ctx,
    106                                    struct pipe_resource *resource,
    107                                    unsigned level,
    108                                    unsigned usage,
    109                                    const struct pipe_box *box,
    110                                    const void *data,
    111                                    unsigned stride,
    112                                    unsigned layer_stride)
    113 {
    114    struct i915_buffer *buffer = i915_buffer(resource);
    115 
    116    memcpy(buffer->data + box->x,
    117           data,
    118           box->width);
    119 }
    120 
    121 
    122 struct u_resource_vtbl i915_buffer_vtbl =
    123 {
    124    i915_buffer_get_handle,	     /* get_handle */
    125    i915_buffer_destroy,		     /* resource_destroy */
    126    i915_get_transfer,		     /* get_transfer */
    127    i915_transfer_destroy,	     /* transfer_destroy */
    128    i915_buffer_transfer_map,	     /* transfer_map */
    129    u_default_transfer_flush_region,  /* transfer_flush_region */
    130    u_default_transfer_unmap,	     /* transfer_unmap */
    131    i915_buffer_transfer_inline_write /* transfer_inline_write */
    132 };
    133 
    134 
    135 
    136 struct pipe_resource *
    137 i915_buffer_create(struct pipe_screen *screen,
    138                     const struct pipe_resource *template)
    139 {
    140    struct i915_buffer *buf = CALLOC_STRUCT(i915_buffer);
    141 
    142    if (!buf)
    143       return NULL;
    144 
    145    buf->b.b = *template;
    146    buf->b.vtbl = &i915_buffer_vtbl;
    147    pipe_reference_init(&buf->b.b.reference, 1);
    148    buf->b.b.screen = screen;
    149    buf->data = align_malloc(template->width0, 16);
    150    buf->free_on_destroy = TRUE;
    151 
    152    if (!buf->data)
    153       goto err;
    154 
    155    return &buf->b.b;
    156 
    157 err:
    158    FREE(buf);
    159    return NULL;
    160 }
    161 
    162 
    163 
    164 struct pipe_resource *
    165 i915_user_buffer_create(struct pipe_screen *screen,
    166                         void *ptr,
    167                         unsigned bytes,
    168                         unsigned bind)
    169 {
    170    struct i915_buffer *buf = CALLOC_STRUCT(i915_buffer);
    171 
    172    if (!buf)
    173       return NULL;
    174 
    175    pipe_reference_init(&buf->b.b.reference, 1);
    176    buf->b.vtbl = &i915_buffer_vtbl;
    177    buf->b.b.screen = screen;
    178    buf->b.b.format = PIPE_FORMAT_R8_UNORM; /* ?? */
    179    buf->b.b.usage = PIPE_USAGE_IMMUTABLE;
    180    buf->b.b.bind = bind;
    181    buf->b.b.flags = 0;
    182    buf->b.b.width0 = bytes;
    183    buf->b.b.height0 = 1;
    184    buf->b.b.depth0 = 1;
    185    buf->b.b.array_size = 1;
    186 
    187    buf->data = ptr;
    188    buf->free_on_destroy = FALSE;
    189 
    190    return &buf->b.b;
    191 }
    192