X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_resource_buffer.h;h=db533416ec4cef9d0591d1cfd7ab48c9eb0ea601;hb=acecee4c2db48fb36bce1170d8747c7345ba3541;hp=0591f8960b9d720f227b436cdd206873f646c695;hpb=958fc04dc51a2561c8598f42df59e3d9139e56a7;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_resource_buffer.h b/src/gallium/drivers/svga/svga_resource_buffer.h index 0591f8960b9..db533416ec4 100644 --- a/src/gallium/drivers/svga/svga_resource_buffer.h +++ b/src/gallium/drivers/svga/svga_resource_buffer.h @@ -58,6 +58,18 @@ struct svga_buffer_range struct svga_3d_update_gb_image; +/** + * This structure describes the bind flags and cache key associated + * with the host surface. + */ +struct svga_buffer_surface +{ + struct list_head list; + unsigned bind_flags; + struct svga_host_surface_cache_key key; + struct svga_winsys_surface *handle; +}; + /** * SVGA pipe buffer. */ @@ -100,6 +112,12 @@ struct svga_buffer */ struct svga_winsys_surface *handle; + /** + * List of surfaces created for this buffer resource to support + * incompatible bind flags. + */ + struct list_head surfaces; + /** * Information about ongoing and past map operations. */ @@ -192,17 +210,26 @@ struct svga_buffer unsigned size; /**< Approximate size in bytes */ boolean dirty; /**< Need to do a readback before mapping? */ + + /** In some cases we try to keep the results of the translate_indices() + * function from svga_draw_elements.c + */ + struct { + enum pipe_prim_type orig_prim, new_prim; + struct pipe_resource *buffer; + unsigned index_size; + unsigned offset; /**< first index */ + unsigned count; /**< num indices */ + } translated_indices; }; static inline struct svga_buffer * -svga_buffer(struct pipe_resource *buffer) +svga_buffer(struct pipe_resource *resource) { - if (buffer) { - assert(((struct svga_buffer *)buffer)->b.vtbl == &svga_buffer_vtbl); - return (struct svga_buffer *)buffer; - } - return NULL; + struct svga_buffer *buf = (struct svga_buffer *) resource; + assert(buf == NULL || buf->b.vtbl == &svga_buffer_vtbl); + return buf; } @@ -246,6 +273,7 @@ svga_buffer_has_hw_storage(struct svga_buffer *sbuf) /** * Map the hardware storage of a buffer. + * \param flags bitmask of PIPE_TRANSFER_* flags */ static inline void * svga_buffer_hw_storage_map(struct svga_context *svga, @@ -254,7 +282,7 @@ svga_buffer_hw_storage_map(struct svga_context *svga, { struct svga_winsys_screen *sws = svga_buffer_winsys_screen(sbuf); - svga->hud.num_resources_mapped++; + svga->hud.num_buffers_mapped++; if (sws->have_gb_objects) { return svga->swc->surface_map(svga->swc, sbuf->handle, flags, retry); @@ -315,7 +343,8 @@ svga_buffer_create(struct pipe_screen *screen, */ struct svga_winsys_surface * svga_buffer_handle(struct svga_context *svga, - struct pipe_resource *buf); + struct pipe_resource *buf, + unsigned tobind_flags); void svga_context_flush_buffers(struct svga_context *svga);