X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_resource_texture.h;h=0c1bb8c4eb1374b7cc15fdf2c0db9483b51fc46a;hb=8a4b0d852c1f28c302e0df6fa63dbc08a32bc683;hp=0326907240e172bddf8a8a96b3d1e4ab282161d6;hpb=005c8e01062e8e88a86904b955d5422742bd32e7;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_resource_texture.h b/src/gallium/drivers/svga/svga_resource_texture.h index 0326907240e..0c1bb8c4eb1 100644 --- a/src/gallium/drivers/svga/svga_resource_texture.h +++ b/src/gallium/drivers/svga/svga_resource_texture.h @@ -47,12 +47,12 @@ enum SVGA3dSurfaceFormat; extern struct u_resource_vtbl svga_texture_vtbl; -struct svga_texture +struct svga_texture { struct u_resource b; ushort *defined; - + struct svga_sampler_view *cached_view; unsigned view_age[SVGA_MAX_TEXTURE_LEVELS]; @@ -62,8 +62,8 @@ struct svga_texture /** * Creation key for the host surface handle. - * - * This structure describes all the host surface characteristics so that it + * + * This structure describes all the host surface characteristics so that it * can be looked up in cache, since creating a host surface is often a slow * operation. */ @@ -77,16 +77,43 @@ struct svga_texture */ struct svga_winsys_surface *handle; + /** + * Whether the host side surface is validated, either through the + * InvalidateGBSurface command or after the surface is updated + * or rendered to. + */ + boolean validated; + /** * Whether the host side surface is imported and not created by this * driver. */ boolean imported; + /** + * Whether texture upload buffer can be used on this texture + */ + boolean can_use_upload; + unsigned size; /**< Approximate size in bytes */ /** array indexed by cube face or 3D/array slice, one bit per mipmap level */ ushort *rendered_to; + + /** array indexed by cube face or 3D/array slice, one bit per mipmap level. + * Set if the level is marked as dirty. + */ + ushort *dirty; + + /** + * A cached backing host side surface to be used if this texture is being + * used for rendering and sampling at the same time. + * Currently we only cache one handle. If needed, we can extend this to + * support multiple handles. + */ + struct svga_host_surface_cache_key backed_key; + struct svga_winsys_surface *backed_handle; + unsigned backed_age; }; @@ -98,6 +125,7 @@ struct svga_transfer struct pipe_transfer base; unsigned slice; /**< array slice or cube face */ + SVGA3dBox box; /* The adjusted box with slice index removed from z */ struct svga_winsys_buffer *hwbuf; @@ -108,11 +136,27 @@ struct svga_transfer * big enough */ void *swbuf; + /* True if guest backed surface is supported and we can directly map + * to the surface for this transfer. + */ boolean use_direct_map; + + struct { + struct pipe_resource *buf; /* points to the upload buffer if this + * transfer is done via the upload buffer + * instead of directly mapping to the + * resource's surface. + */ + void *map; + unsigned offset; + SVGA3dBox box; + unsigned nlayers; + } upload; }; -static inline struct svga_texture *svga_texture( struct pipe_resource *resource ) +static inline struct svga_texture * +svga_texture(struct pipe_resource *resource) { struct svga_texture *tex = (struct svga_texture *)resource; assert(tex == NULL || tex->b.vtbl == &svga_texture_vtbl); @@ -136,7 +180,7 @@ svga_transfer(struct pipe_transfer *transfer) static inline void svga_age_texture_view(struct svga_texture *tex, unsigned level) { - assert(level < Elements(tex->view_age)); + assert(level < ARRAY_SIZE(tex->view_age)); tex->view_age[level] = ++(tex->age); } @@ -169,6 +213,7 @@ svga_define_texture_level(struct svga_texture *tex, { check_face_level(tex, face, level); tex->defined[face] |= 1 << level; + tex->validated = TRUE; } @@ -187,6 +232,7 @@ svga_set_texture_rendered_to(struct svga_texture *tex, { check_face_level(tex, face, level); tex->rendered_to[face] |= 1 << level; + tex->validated = TRUE; } @@ -207,6 +253,30 @@ svga_was_texture_rendered_to(const struct svga_texture *tex, return !!(tex->rendered_to[face] & (1 << level)); } +static inline void +svga_set_texture_dirty(struct svga_texture *tex, + unsigned face, unsigned level) +{ + check_face_level(tex, face, level); + tex->dirty[face] |= 1 << level; +} + +static inline void +svga_clear_texture_dirty(struct svga_texture *tex) +{ + unsigned i; + for (i = 0; i < tex->b.b.depth0 * tex->b.b.array_size; i++) { + tex->dirty[i] = 0; + } +} + +static inline boolean +svga_is_texture_dirty(const struct svga_texture *tex, + unsigned face, unsigned level) +{ + check_face_level(tex, face, level); + return !!(tex->dirty[face] & (1 << level)); +} struct pipe_resource * svga_texture_create(struct pipe_screen *screen, @@ -214,10 +284,37 @@ svga_texture_create(struct pipe_screen *screen, struct pipe_resource * svga_texture_from_handle(struct pipe_screen * screen, - const struct pipe_resource *template, - struct winsys_handle *whandle); - - - + const struct pipe_resource *template, + struct winsys_handle *whandle); + +bool +svga_texture_generate_mipmap(struct pipe_context *pipe, + struct pipe_resource *pt, + enum pipe_format format, + unsigned base_level, + unsigned last_level, + unsigned first_layer, + unsigned last_layer); + +boolean +svga_texture_transfer_map_upload_create(struct svga_context *svga); + +void +svga_texture_transfer_map_upload_destroy(struct svga_context *svga); + +boolean +svga_texture_transfer_map_can_upload(const struct svga_screen *svgascreen, + const struct pipe_resource *pt); + +void * +svga_texture_transfer_map_upload(struct svga_context *svga, + struct svga_transfer *st); + +void +svga_texture_transfer_unmap_upload(struct svga_context *svga, + struct svga_transfer *st); + +boolean +svga_texture_device_format_has_alpha(struct pipe_resource *texture); #endif /* SVGA_TEXTURE_H */