diff options
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.c | 6 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 13 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_query.c | 9 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_render.c | 40 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_resource.c | 2 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_screen_buffer.c | 18 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_screen_buffer.h | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state.c | 8 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_texture.c | 19 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_transfer.c | 15 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_winsys.h | 78 | 
11 files changed, 82 insertions, 129 deletions
| diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c index 960e3c346e..3608c04dc9 100644 --- a/src/gallium/drivers/r300/r300_context.c +++ b/src/gallium/drivers/r300/r300_context.c @@ -548,14 +548,12 @@ void r300_finish(struct r300_context *r300)          for (i = 0; i < fb->nr_cbufs; i++) {              if (fb->cbufs[i]->texture) { -                r300->rws->buffer_wait(r300->rws, -                    r300_resource(fb->cbufs[i]->texture)->buf); +                r300->rws->buffer_wait(r300_resource(fb->cbufs[i]->texture)->buf);                  return;              }          }          if (fb->zsbuf && fb->zsbuf->texture) { -            r300->rws->buffer_wait(r300->rws, -                r300_resource(fb->zsbuf->texture)->buf); +            r300->rws->buffer_wait(r300_resource(fb->zsbuf->texture)->buf);          }      }  } diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index 480233bae5..9335c680bf 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -34,6 +34,7 @@  #include "r300_defines.h"  #include "r300_screen.h" +#include "r300_winsys.h"  struct u_upload_mgr;  struct r300_context; @@ -273,8 +274,8 @@ struct r300_query {      boolean begin_emitted;      /* The buffer where query results are stored. */ -    struct r300_winsys_buffer *buf; -    struct r300_winsys_cs_buffer *cs_buf; +    struct r300_winsys_bo *buf; +    struct r300_winsys_cs_handle *cs_buf;      /* The size of the buffer. */      unsigned buffer_size;      /* The domain of the buffer. */ @@ -305,8 +306,8 @@ struct r300_surface {      struct pipe_surface base;      /* Winsys buffer backing the texture. */ -    struct r300_winsys_buffer *buf; -    struct r300_winsys_cs_buffer *cs_buf; +    struct r300_winsys_bo *buf; +    struct r300_winsys_cs_handle *cs_buf;      enum r300_buffer_domain domain; @@ -389,8 +390,8 @@ struct r300_resource      struct u_vbuf_resource b;      /* Winsys buffer backing this resource. */ -    struct r300_winsys_buffer *buf; -    struct r300_winsys_cs_buffer *cs_buf; +    struct r300_winsys_bo *buf; +    struct r300_winsys_cs_handle *cs_buf;      enum r300_buffer_domain domain;      unsigned buf_size; diff --git a/src/gallium/drivers/r300/r300_query.c b/src/gallium/drivers/r300/r300_query.c index 62dee8db59..da871dc3a8 100644 --- a/src/gallium/drivers/r300/r300_query.c +++ b/src/gallium/drivers/r300/r300_query.c @@ -60,7 +60,7 @@ static struct pipe_query *r300_create_query(struct pipe_context *pipe,      q->buf = r300->rws->buffer_create(r300->rws, q->buffer_size, 4096,                                           PIPE_BIND_CUSTOM, PIPE_USAGE_STREAM,                                           q->domain); -    q->cs_buf = r300->rws->buffer_get_cs_handle(r300->rws, q->buf); +    q->cs_buf = r300->rws->buffer_get_cs_handle(q->buf);      return (struct pipe_query*)q;  } @@ -68,10 +68,9 @@ static struct pipe_query *r300_create_query(struct pipe_context *pipe,  static void r300_destroy_query(struct pipe_context* pipe,                                 struct pipe_query* query)  { -    struct r300_context *r300 = r300_context(pipe);      struct r300_query* q = r300_query(query); -    r300->rws->buffer_reference(r300->rws, &q->buf, NULL); +    r300_winsys_bo_reference(&q->buf, NULL);      remove_from_list(q);      FREE(query);  } @@ -137,7 +136,7 @@ static boolean r300_get_query_result(struct pipe_context* pipe,      flags = PIPE_TRANSFER_READ | (!wait ? PIPE_TRANSFER_DONTBLOCK : 0); -    map = r300->rws->buffer_map(r300->rws, q->buf, r300->cs, flags); +    map = r300->rws->buffer_map(q->buf, r300->cs, flags);      if (!map)          return FALSE; @@ -148,7 +147,7 @@ static boolean r300_get_query_result(struct pipe_context* pipe,          map++;      } -    r300->rws->buffer_unmap(r300->rws, q->buf); +    r300->rws->buffer_unmap(q->buf);      *result = temp;      return TRUE; diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c index eda5c48cfb..ca55984ad9 100644 --- a/src/gallium/drivers/r300/r300_render.c +++ b/src/gallium/drivers/r300/r300_render.c @@ -330,15 +330,10 @@ static boolean immd_is_good_idea(struct r300_context *r300,          if (!checked[vbi]) {              buf = r300->vbuf_mgr->real_vertex_buffer[vbi]; -            if (!(r300_resource(buf)->domain & R300_DOMAIN_GTT)) { +            if ((r300_resource(buf)->domain != R300_DOMAIN_GTT)) {                  return FALSE;              } -            if (r300_buffer_is_referenced(&r300->context, buf, -                                          R300_REF_CS | R300_REF_HW)) { -                /* It's a very bad idea to map it... */ -                return FALSE; -            }              checked[vbi] = TRUE;          }      } @@ -395,7 +390,8 @@ static void r300_emit_draw_arrays_immediate(struct r300_context *r300,          if (!transfer[vbi]) {              map[vbi] = (uint32_t*)pipe_buffer_map(&r300->context,                                                    r300->vbuf_mgr->real_vertex_buffer[vbi], -                                                  PIPE_TRANSFER_READ, +                                                  PIPE_TRANSFER_READ | +                                                  PIPE_TRANSFER_UNSYNCHRONIZED,  						  &transfer[vbi]);              map[vbi] += (vbuf->buffer_offset / 4) + stride[i] * start;          } @@ -575,7 +571,9 @@ static void r300_draw_range_elements(struct pipe_context* pipe,          struct pipe_resource *userbuf;          uint16_t *ptr = pipe_buffer_map(pipe, indexBuffer, -                                        PIPE_TRANSFER_READ, &transfer); +                                        PIPE_TRANSFER_READ | +                                        PIPE_TRANSFER_UNSYNCHRONIZED, +                                        &transfer);          if (mode == PIPE_PRIM_TRIANGLES) {             memcpy(indices3, ptr + start, 6); @@ -771,7 +769,8 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,          if (r300->vbuf_mgr->vertex_buffer[i].buffer) {              void *buf = pipe_buffer_map(pipe,                                    r300->vbuf_mgr->vertex_buffer[i].buffer, -                                  PIPE_TRANSFER_READ, +                                  PIPE_TRANSFER_READ | +                                  PIPE_TRANSFER_UNSYNCHRONIZED,                                    &vb_transfer[i]);              draw_set_mapped_vertex_buffer(r300->draw, i, buf);          } @@ -779,7 +778,8 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,      if (indexed) {          indices = pipe_buffer_map(pipe, r300->index_buffer.buffer, -                                  PIPE_TRANSFER_READ, &ib_transfer); +                                  PIPE_TRANSFER_READ | +                                  PIPE_TRANSFER_UNSYNCHRONIZED, &ib_transfer);      }      draw_set_mapped_index_buffer(r300->draw, indices); @@ -876,7 +876,8 @@ static void* r300_render_map_vertices(struct vbuf_render* render)      r300render->vbo_ptr = pipe_buffer_map(&r300render->r300->context,  					  r300->vbo, -                                          PIPE_TRANSFER_WRITE, +                                          PIPE_TRANSFER_WRITE | +                                          PIPE_TRANSFER_UNSYNCHRONIZED,  					  &r300render->vbo_transfer);      assert(r300render->vbo_ptr); @@ -952,23 +953,6 @@ static void r300_render_draw_arrays(struct vbuf_render* render,              return;      } -    /* Uncomment to dump all VBOs rendered through this interface. -     * Slow and noisy! -    ptr = pipe_buffer_map(&r300render->r300->context, -                          r300render->vbo, PIPE_TRANSFER_READ, -                          &r300render->vbo_transfer); - -    for (i = 0; i < count; i++) { -        printf("r300: Vertex %d\n", i); -        draw_dump_emitted_vertex(&r300->vertex_info, ptr); -        ptr += r300->vertex_info.size * 4; -        printf("\n"); -    } - -    pipe_buffer_unmap(&r300render->r300->context, r300render->vbo, -        r300render->vbo_transfer); -    */ -      BEGIN_CS(dwords);      OUT_CS_REG(R300_GA_COLOR_CONTROL,              r300_provoking_vertex_fixes(r300, r300render->prim)); diff --git a/src/gallium/drivers/r300/r300_resource.c b/src/gallium/drivers/r300/r300_resource.c index d788cedb17..f3d8c5b889 100644 --- a/src/gallium/drivers/r300/r300_resource.c +++ b/src/gallium/drivers/r300/r300_resource.c @@ -42,7 +42,7 @@ static unsigned r300_resource_is_referenced_by_cs(struct pipe_context *context,                                                    struct pipe_resource *buf,                                                    unsigned level, int layer)  { -    return r300_buffer_is_referenced(context, buf, R300_REF_CS); +    return r300_buffer_is_referenced(context, buf);  }  void r300_init_resource_functions(struct r300_context *r300) diff --git a/src/gallium/drivers/r300/r300_screen_buffer.c b/src/gallium/drivers/r300/r300_screen_buffer.c index bc4762c108..2e85e2d6ff 100644 --- a/src/gallium/drivers/r300/r300_screen_buffer.c +++ b/src/gallium/drivers/r300/r300_screen_buffer.c @@ -34,8 +34,7 @@  #include "r300_winsys.h"  unsigned r300_buffer_is_referenced(struct pipe_context *context, -				   struct pipe_resource *buf, -                                   enum r300_reference_domain domain) +				   struct pipe_resource *buf)  {      struct r300_context *r300 = r300_context(context);      struct r300_resource *rbuf = r300_resource(buf); @@ -43,7 +42,7 @@ unsigned r300_buffer_is_referenced(struct pipe_context *context,      if (rbuf->b.user_ptr || rbuf->constant_buffer)   	return PIPE_UNREFERENCED; -    if (r300->rws->cs_is_buffer_referenced(r300->cs, rbuf->cs_buf, domain)) +    if (r300->rws->cs_is_buffer_referenced(r300->cs, rbuf->cs_buf))          return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;      return PIPE_UNREFERENCED; @@ -79,13 +78,12 @@ static void r300_buffer_destroy(struct pipe_screen *screen,  {      struct r300_screen *r300screen = r300_screen(screen);      struct r300_resource *rbuf = r300_resource(buf); -    struct r300_winsys_screen *rws = r300screen->rws;      if (rbuf->constant_buffer)          FREE(rbuf->constant_buffer);      if (rbuf->buf) -        rws->buffer_reference(rws, &rbuf->buf, NULL); +        r300_winsys_bo_reference(&rbuf->buf, NULL);      util_slab_free(&r300screen->pool_buffers, rbuf);  } @@ -137,7 +135,7 @@ r300_buffer_transfer_map( struct pipe_context *pipe,      if (rbuf->constant_buffer)          return (uint8_t *) rbuf->constant_buffer + transfer->box.x; -    map = rws->buffer_map(rws, rbuf->buf, r300->cs, transfer->usage); +    map = rws->buffer_map(rbuf->buf, r300->cs, transfer->usage);      if (map == NULL)          return NULL; @@ -153,7 +151,7 @@ static void r300_buffer_transfer_unmap( struct pipe_context *pipe,      struct r300_resource *rbuf = r300_resource(transfer->resource);      if (rbuf->buf) { -        rws->buffer_unmap(rws, rbuf->buf); +        rws->buffer_unmap(rbuf->buf);      }  } @@ -177,12 +175,12 @@ static void r300_buffer_transfer_inline_write(struct pipe_context *pipe,      }      assert(rbuf->b.user_ptr == NULL); -    map = rws->buffer_map(rws, rbuf->buf, r300->cs, +    map = rws->buffer_map(rbuf->buf, r300->cs,                            PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | usage);      memcpy(map + box->x, data, box->width); -    rws->buffer_unmap(rws, rbuf->buf); +    rws->buffer_unmap(rbuf->buf);  }  static const struct u_resource_vtbl r300_buffer_vtbl = @@ -229,7 +227,7 @@ struct pipe_resource *r300_buffer_create(struct pipe_screen *screen,                                         rbuf->b.b.b.bind, rbuf->b.b.b.usage,                                         rbuf->domain);      rbuf->cs_buf = -        r300screen->rws->buffer_get_cs_handle(r300screen->rws, rbuf->buf); +        r300screen->rws->buffer_get_cs_handle(rbuf->buf);      if (!rbuf->buf) {          util_slab_free(&r300screen->pool_buffers, rbuf); diff --git a/src/gallium/drivers/r300/r300_screen_buffer.h b/src/gallium/drivers/r300/r300_screen_buffer.h index 3276f843b0..ae87c4406a 100644 --- a/src/gallium/drivers/r300/r300_screen_buffer.h +++ b/src/gallium/drivers/r300/r300_screen_buffer.h @@ -50,8 +50,7 @@ struct pipe_resource *r300_user_buffer_create(struct pipe_screen *screen,  					      unsigned bind);  unsigned r300_buffer_is_referenced(struct pipe_context *context, -				   struct pipe_resource *buf, -                                   enum r300_reference_domain domain); +				   struct pipe_resource *buf);  /* Inline functions. */ diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index f0b4ad57bf..2ec9600379 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -616,7 +616,8 @@ static void r300_set_stencil_ref(struct pipe_context* pipe,  }  static void r300_tex_set_tiling_flags(struct r300_context *r300, -                                      struct r300_resource *tex, unsigned level) +                                      struct r300_resource *tex, +                                      unsigned level)  {      /* Check if the macrotile flag needs to be changed.       * Skip changing the flags otherwise. */ @@ -624,11 +625,10 @@ static void r300_tex_set_tiling_flags(struct r300_context *r300,          tex->tex.macrotile[level]) {          /* Tiling determines how DRM treats the buffer data.           * We must flush CS when changing it if the buffer is referenced. */ -        if (r300->rws->cs_is_buffer_referenced(r300->cs, -                                               tex->cs_buf, R300_REF_CS)) +        if (r300->rws->cs_is_buffer_referenced(r300->cs, tex->cs_buf))              r300->context.flush(&r300->context, 0, NULL); -        r300->rws->buffer_set_tiling(r300->rws, tex->buf, +        r300->rws->buffer_set_tiling(tex->buf,                  tex->tex.microtile, tex->tex.macrotile[level],                  tex->tex.stride_in_bytes[0]); diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index 8ed0374513..45a896d610 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -706,10 +706,9 @@ static void r300_texture_destroy(struct pipe_screen *screen,                                   struct pipe_resource* texture)  {      struct r300_resource* tex = (struct r300_resource*)texture; -    struct r300_winsys_screen *rws = (struct r300_winsys_screen *)texture->screen->winsys;      int i; -    rws->buffer_reference(rws, &tex->buf, NULL); +    r300_winsys_bo_reference(&tex->buf, NULL);      for (i = 0; i < R300_MAX_TEXTURE_LEVELS; i++) {          if (tex->hiz_mem[i])              u_mmFreeMem(tex->hiz_mem[i]); @@ -729,7 +728,7 @@ boolean r300_resource_get_handle(struct pipe_screen* screen,          return FALSE;      } -    return rws->buffer_get_handle(rws, tex->buf, +    return rws->buffer_get_handle(tex->buf,                                    tex->tex.stride_in_bytes[0], whandle);  } @@ -754,13 +753,13 @@ r300_texture_create_object(struct r300_screen *rscreen,                             enum r300_buffer_tiling macrotile,                             unsigned stride_in_bytes_override,                             unsigned max_buffer_size, -                           struct r300_winsys_buffer *buffer) +                           struct r300_winsys_bo *buffer)  {      struct r300_winsys_screen *rws = rscreen->rws;      struct r300_resource *tex = CALLOC_STRUCT(r300_resource);      if (!tex) {          if (buffer) -            rws->buffer_reference(rws, &buffer, NULL); +            r300_winsys_bo_reference(&buffer, NULL);          return NULL;      } @@ -780,7 +779,7 @@ r300_texture_create_object(struct r300_screen *rscreen,      if (!r300_resource_set_properties(&rscreen->screen, &tex->b.b.b, 0, base)) {          if (buffer) -            rws->buffer_reference(rws, &buffer, NULL); +            r300_winsys_bo_reference(&buffer, NULL);          FREE(tex);          return NULL;      } @@ -799,9 +798,9 @@ r300_texture_create_object(struct r300_screen *rscreen,          tex->buf = buffer;      } -    tex->cs_buf = rws->buffer_get_cs_handle(rws, tex->buf); +    tex->cs_buf = rws->buffer_get_cs_handle(tex->buf); -    rws->buffer_set_tiling(rws, tex->buf, +    rws->buffer_set_tiling(tex->buf,              tex->tex.microtile, tex->tex.macrotile[0],              tex->tex.stride_in_bytes[0]); @@ -835,7 +834,7 @@ struct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen,  {      struct r300_winsys_screen *rws = (struct r300_winsys_screen*)screen->winsys;      struct r300_screen *rscreen = r300_screen(screen); -    struct r300_winsys_buffer *buffer; +    struct r300_winsys_bo *buffer;      enum r300_buffer_tiling microtile, macrotile;      unsigned stride, size; @@ -851,7 +850,7 @@ struct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen,      if (!buffer)          return NULL; -    rws->buffer_get_tiling(rws, buffer, µtile, ¯otile); +    rws->buffer_get_tiling(buffer, µtile, ¯otile);      /* Enforce a microtiled zbuffer. */      if (util_format_is_depth_or_stencil(base->format) && diff --git a/src/gallium/drivers/r300/r300_transfer.c b/src/gallium/drivers/r300/r300_transfer.c index f2b6b45ef1..b557212887 100644 --- a/src/gallium/drivers/r300/r300_transfer.c +++ b/src/gallium/drivers/r300/r300_transfer.c @@ -89,14 +89,12 @@ r300_texture_get_transfer(struct pipe_context *ctx,      boolean referenced_cs, referenced_hw, blittable;      referenced_cs = -        r300->rws->cs_is_buffer_referenced(r300->cs, -                                           tex->cs_buf, R300_REF_CS); +        r300->rws->cs_is_buffer_referenced(r300->cs, tex->cs_buf);      if (referenced_cs) {          referenced_hw = TRUE;      } else {          referenced_hw = -            r300->rws->cs_is_buffer_referenced(r300->cs, -                                               tex->cs_buf, R300_REF_HW); +            r300->rws->buffer_is_busy(tex->buf);      }      blittable = ctx->screen->is_format_supported( @@ -239,13 +237,12 @@ void* r300_texture_transfer_map(struct pipe_context *ctx,      if (r300transfer->linear_texture) {          /* The detiled texture is of the same size as the region being mapped           * (no offset needed). */ -        return rws->buffer_map(rws, -                               r300transfer->linear_texture->buf, +        return rws->buffer_map(r300transfer->linear_texture->buf,                                 r300->cs,                                 transfer->usage);      } else {          /* Tiling is disabled. */ -        map = rws->buffer_map(rws, tex->buf, r300->cs, +        map = rws->buffer_map(tex->buf, r300->cs,                                transfer->usage);          if (!map) { @@ -266,8 +263,8 @@ void r300_texture_transfer_unmap(struct pipe_context *ctx,      struct r300_resource *tex = r300_resource(transfer->resource);      if (r300transfer->linear_texture) { -        rws->buffer_unmap(rws, r300transfer->linear_texture->buf); +        rws->buffer_unmap(r300transfer->linear_texture->buf);      } else { -        rws->buffer_unmap(rws, tex->buf); +        rws->buffer_unmap(tex->buf);      }  } diff --git a/src/gallium/drivers/r300/r300_winsys.h b/src/gallium/drivers/r300/r300_winsys.h index 2e8ccdde54..bf1dd5c980 100644 --- a/src/gallium/drivers/r300/r300_winsys.h +++ b/src/gallium/drivers/r300/r300_winsys.h @@ -28,18 +28,21 @@   * Any winsys hosting this pipe needs to implement r300_winsys_screen and then   * call r300_screen_create to start things. */ +#include "r300_defines.h" + +#include "pipebuffer/pb_bufmgr.h"  #include "pipe/p_defines.h"  #include "pipe/p_state.h" -#include "r300_defines.h" -  #define R300_MAX_CMDBUF_DWORDS (16 * 1024)  struct winsys_handle;  struct r300_winsys_screen; -struct r300_winsys_buffer;      /* for map/unmap etc. */ -struct r300_winsys_cs_buffer;   /* for write_reloc etc. */ +#define r300_winsys_bo                      pb_buffer +#define r300_winsys_bo_reference(pdst, src) pb_reference(pdst, src) + +struct r300_winsys_cs_handle;   /* for write_reloc etc. */  struct r300_winsys_cs {      unsigned cdw;                           /* Number of used dwords. */ @@ -66,11 +69,6 @@ enum r300_value_id {      R300_CAN_AACOMPRESS, /* CMask */  }; -enum r300_reference_domain { /* bitfield */ -    R300_REF_CS = 1, -    R300_REF_HW = 2 -}; -  struct r300_winsys_screen {      /**       * Destroy this winsys. @@ -107,82 +105,68 @@ struct r300_winsys_screen {       * \param domain    A bitmask of the R300_DOMAIN_* flags.       * \return          The created buffer object.       */ -    struct r300_winsys_buffer *(*buffer_create)(struct r300_winsys_screen *ws, +    struct r300_winsys_bo *(*buffer_create)(struct r300_winsys_screen *ws,                                                  unsigned size,                                                  unsigned alignment,                                                  unsigned bind,                                                  unsigned usage,                                                  enum r300_buffer_domain domain); -    struct r300_winsys_cs_buffer *(*buffer_get_cs_handle)( -            struct r300_winsys_screen *ws, -            struct r300_winsys_buffer *buf); - -    /** -     * Reference a buffer object (assign with reference counting). -     * -     * \param ws        The winsys this function is called from. -     * \param pdst      A destination pointer to set the source buffer to. -     * \param src       A source buffer object. -     */ -    void (*buffer_reference)(struct r300_winsys_screen *ws, -                             struct r300_winsys_buffer **pdst, -                             struct r300_winsys_buffer *src); +    struct r300_winsys_cs_handle *(*buffer_get_cs_handle)( +            struct r300_winsys_bo *buf);      /**       * Map the entire data store of a buffer object into the client's address       * space.       * -     * \param ws        The winsys this function is called from.       * \param buf       A winsys buffer object to map.       * \param cs        A command stream to flush if the buffer is referenced by it.       * \param usage     A bitmask of the PIPE_TRANSFER_* flags.       * \return          The pointer at the beginning of the buffer.       */ -    void *(*buffer_map)(struct r300_winsys_screen *ws, -                        struct r300_winsys_buffer *buf, +    void *(*buffer_map)(struct r300_winsys_bo *buf,                          struct r300_winsys_cs *cs,                          enum pipe_transfer_usage usage);      /**       * Unmap a buffer object from the client's address space.       * -     * \param ws        The winsys this function is called from.       * \param buf       A winsys buffer object to unmap.       */ -    void (*buffer_unmap)(struct r300_winsys_screen *ws, -                         struct r300_winsys_buffer *buf); +    void (*buffer_unmap)(struct r300_winsys_bo *buf); + +    /** +     * Return TRUE if a buffer object is being used by the GPU. +     * +     * \param buf       A winsys buffer object. +     */ +    boolean (*buffer_is_busy)(struct r300_winsys_bo *buf);      /**       * Wait for a buffer object until it is not used by a GPU. This is       * equivalent to a fence placed after the last command using the buffer,       * and synchronizing to the fence.       * -     * \param ws        The winsys this function is called from.       * \param buf       A winsys buffer object to wait for.       */ -    void (*buffer_wait)(struct r300_winsys_screen *ws, -                        struct r300_winsys_buffer *buf); +    void (*buffer_wait)(struct r300_winsys_bo *buf);      /**       * Return tiling flags describing a memory layout of a buffer object.       * -     * \param ws        The winsys this function is called from.       * \param buf       A winsys buffer object to get the flags from.       * \param macrotile A pointer to the return value of the microtile flag.       * \param microtile A pointer to the return value of the macrotile flag.       *       * \note microtile and macrotile are not bitmasks!       */ -    void (*buffer_get_tiling)(struct r300_winsys_screen *ws, -                              struct r300_winsys_buffer *buf, +    void (*buffer_get_tiling)(struct r300_winsys_bo *buf,                                enum r300_buffer_tiling *microtile,                                enum r300_buffer_tiling *macrotile);      /**       * Set tiling flags describing a memory layout of a buffer object.       * -     * \param ws        The winsys this function is called from.       * \param buf       A winsys buffer object to set the flags for.       * \param macrotile A macrotile flag.       * \param microtile A microtile flag. @@ -190,8 +174,7 @@ struct r300_winsys_screen {       *       * \note microtile and macrotile are not bitmasks!       */ -    void (*buffer_set_tiling)(struct r300_winsys_screen *ws, -                              struct r300_winsys_buffer *buf, +    void (*buffer_set_tiling)(struct r300_winsys_bo *buf,                                enum r300_buffer_tiling microtile,                                enum r300_buffer_tiling macrotile,                                unsigned stride); @@ -206,7 +189,7 @@ struct r300_winsys_screen {       * \param stride    The returned buffer stride in bytes.       * \param size      The returned buffer size.       */ -    struct r300_winsys_buffer *(*buffer_from_handle)(struct r300_winsys_screen *ws, +    struct r300_winsys_bo *(*buffer_from_handle)(struct r300_winsys_screen *ws,                                                       struct winsys_handle *whandle,                                                       unsigned *stride,                                                       unsigned *size); @@ -215,14 +198,12 @@ struct r300_winsys_screen {       * Get a winsys handle from a winsys buffer. The internal structure       * of the handle is platform-specific and only a winsys should access it.       * -     * \param ws        The winsys this function is called from.       * \param buf       A winsys buffer object to get the handle from.       * \param whandle   A winsys handle pointer.       * \param stride    A stride of the buffer in bytes, for texturing.       * \return          TRUE on success.       */ -    boolean (*buffer_get_handle)(struct r300_winsys_screen *ws, -                                 struct r300_winsys_buffer *buf, +    boolean (*buffer_get_handle)(struct r300_winsys_bo *buf,                                   unsigned stride,                                   struct winsys_handle *whandle); @@ -257,7 +238,7 @@ struct r300_winsys_screen {       * \param wd  A write domain containing a bitmask of the R300_DOMAIN_* flags.       */      void (*cs_add_reloc)(struct r300_winsys_cs *cs, -                         struct r300_winsys_cs_buffer *buf, +                         struct r300_winsys_cs_handle *buf,                           enum r300_buffer_domain rd,                           enum r300_buffer_domain wd); @@ -278,7 +259,7 @@ struct r300_winsys_screen {       * \param wd        A write domain containing a bitmask of the R300_DOMAIN_* flags.       */      void (*cs_write_reloc)(struct r300_winsys_cs *cs, -                           struct r300_winsys_cs_buffer *buf); +                           struct r300_winsys_cs_handle *buf);      /**       * Flush a command stream. @@ -300,16 +281,13 @@ struct r300_winsys_screen {                           void *user);      /** -     * Return TRUE if a buffer is referenced by a command stream or by hardware -     * (i.e. is busy), based on the domain parameter. +     * Return TRUE if a buffer is referenced by a command stream.       *       * \param cs        A command stream.       * \param buf       A winsys buffer. -     * \param domain    A bitmask of the R300_REF_* enums.       */      boolean (*cs_is_buffer_referenced)(struct r300_winsys_cs *cs, -                                       struct r300_winsys_cs_buffer *buf, -                                       enum r300_reference_domain domain); +                                       struct r300_winsys_cs_handle *buf);  };  #endif /* R300_WINSYS_H */ | 
