X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fr600%2Fr600_resource.h;h=13fce002df50e2af8ce3f81d64b69cba63d61c0c;hb=da98bb6fc105e1a2f688a1713ca9e50f0ac8fbed;hp=ef484aba4a2fa10c9435a773c7c568e04bfc4d27;hpb=f8778eeb40daf355f8dbcfeb1a9b492c57ce6a35;p=mesa.git diff --git a/src/gallium/drivers/r600/r600_resource.h b/src/gallium/drivers/r600/r600_resource.h index ef484aba4a2..13fce002df5 100644 --- a/src/gallium/drivers/r600/r600_resource.h +++ b/src/gallium/drivers/r600/r600_resource.h @@ -23,50 +23,57 @@ #ifndef R600_RESOURCE_H #define R600_RESOURCE_H -#include "util/u_transfer.h" +#include "r600.h" + +/* flag to indicate a resource is to be used as a transfer so should not be tiled */ +#define R600_RESOURCE_FLAG_TRANSFER PIPE_RESOURCE_FLAG_DRV_PRIV -/* Texture transfer. */ struct r600_transfer { - /* Base class. */ struct pipe_transfer transfer; - /* Buffer transfer. */ - struct pipe_transfer *buffer_transfer; + struct r600_resource *staging; unsigned offset; - struct pipe_resource *linear_texture; }; -/* This gets further specialized into either buffer or texture - * structures. Use the vtbl struct to choose between the two - * underlying implementations. - */ -struct r600_resource { - struct u_resource base; - struct r600_bo *bo; - u32 domain; - u32 flink; - u32 size; +struct compute_memory_item; + +struct r600_resource_global { + struct r600_resource base; + struct compute_memory_item *chunk; }; struct r600_resource_texture { struct r600_resource resource; + + /* If this resource is a depth-stencil buffer on evergreen, this contains + * the depth part of the format. There is a separate stencil resource + * for the stencil buffer below. */ + enum pipe_format real_format; + unsigned offset[PIPE_MAX_TEXTURE_LEVELS]; - unsigned pitch_in_bytes[PIPE_MAX_TEXTURE_LEVELS]; - unsigned pitch_in_pixels[PIPE_MAX_TEXTURE_LEVELS]; + unsigned pitch_in_bytes[PIPE_MAX_TEXTURE_LEVELS]; /* transfer */ + unsigned pitch_in_blocks[PIPE_MAX_TEXTURE_LEVELS]; /* texture resource */ unsigned layer_size[PIPE_MAX_TEXTURE_LEVELS]; + unsigned array_mode[PIPE_MAX_TEXTURE_LEVELS]; unsigned pitch_override; unsigned size; - unsigned tiled; - unsigned array_mode; unsigned tile_type; - unsigned depth; - unsigned dirty; - struct r600_resource_texture *flushed_depth_texture; + bool is_depth; + unsigned dirty_db; + struct r600_resource_texture *stencil; /* Stencil is in a separate buffer on Evergreen. */ + struct r600_resource_texture *flushed_depth_texture; + boolean is_flushing_texture; + struct radeon_surface surface; }; -void r600_init_screen_resource_functions(struct pipe_screen *screen); +#define R600_TEX_IS_TILED(tex, level) ((tex)->array_mode[level] != V_038000_ARRAY_LINEAR_GENERAL && (tex)->array_mode[level] != V_038000_ARRAY_LINEAR_ALIGNED) + +struct r600_surface { + struct pipe_surface base; + unsigned aligned_height; +}; -/* r600_buffer */ -u32 r600_domain_from_usage(unsigned usage); +void r600_resource_destroy(struct pipe_screen *screen, struct pipe_resource *res); +void r600_init_screen_resource_functions(struct pipe_screen *screen); /* r600_texture */ struct pipe_resource *r600_texture_create(struct pipe_screen *screen, @@ -75,46 +82,20 @@ struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen, const struct pipe_resource *base, struct winsys_handle *whandle); -#define R600_BUFFER_MAGIC 0xabcd1600 -#define R600_BUFFER_MAX_RANGES 32 - -struct r600_buffer_range { - uint32_t start; - uint32_t end; -}; - -struct r600_resource_buffer { - struct r600_resource r; - uint32_t magic; - void *user_buffer; - struct r600_buffer_range ranges[R600_BUFFER_MAX_RANGES]; - unsigned num_ranges; -}; - -/* r600_buffer */ -static INLINE struct r600_resource_buffer *r600_buffer(struct pipe_resource *buffer) +static INLINE struct r600_resource *r600_resource(struct pipe_resource *r) { - if (buffer) { - assert(((struct r600_resource_buffer *)buffer)->magic == R600_BUFFER_MAGIC); - return (struct r600_resource_buffer *)buffer; - } - return NULL; + return (struct r600_resource*)r; } -static INLINE boolean r600_buffer_is_user_buffer(struct pipe_resource *buffer) -{ - return r600_buffer(buffer)->user_buffer ? TRUE : FALSE; -} - -int r600_texture_depth_flush(struct pipe_context *ctx, - struct pipe_resource *texture); - -extern int (*r600_blit_uncompress_depth_ptr)(struct pipe_context *ctx, struct r600_resource_texture *texture); +void r600_init_flushed_depth_texture(struct pipe_context *ctx, + struct pipe_resource *texture); +void r600_texture_depth_flush(struct pipe_context *ctx, + struct pipe_resource *texture); /* r600_texture.c texture transfer functions. */ struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx, struct pipe_resource *texture, - struct pipe_subresource sr, + unsigned level, unsigned usage, const struct pipe_box *box); void r600_texture_transfer_destroy(struct pipe_context *ctx,