struct sw_displaytarget;
+enum swr_resource_status {
+ SWR_RESOURCE_UNUSED = 0x0,
+ SWR_RESOURCE_READ = 0x1,
+ SWR_RESOURCE_WRITE = 0x2,
+};
+
struct swr_resource {
struct pipe_resource base;
bool has_depth;
bool has_stencil;
- UINT alignedWidth;
- UINT alignedHeight;
-
SWR_SURFACE_STATE swr;
- SWR_SURFACE_STATE secondary; // for faking depth/stencil merged formats
+ SWR_SURFACE_STATE secondary; /* for faking depth/stencil merged formats */
struct sw_displaytarget *display_target;
- unsigned row_stride[PIPE_MAX_TEXTURE_LEVELS];
- unsigned img_stride[PIPE_MAX_TEXTURE_LEVELS];
- unsigned mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
+ /* If resource is multisample, then this points to a alternate resource
+ * containing the resolved multisample surface, otherwise null */
+ struct pipe_resource *resolve_target;
+
+ size_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
+ size_t secondary_mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
+
+ enum swr_resource_status status;
- /* Opaque pointer to swr_context to mark resource in use */
- void *bound_to_context;
+ /* last pipe that used (validated) this resource */
+ struct pipe_context *curr_pipe;
};
}
-static INLINE void *
+static INLINE uint8_t *
swr_resource_data(struct pipe_resource *resource)
{
struct swr_resource *swr_r = swr_resource(resource);
assert(!swr_resource_is_texture(resource));
- return swr_r->swr.pBaseAddress;
+ return (uint8_t*)(swr_r->swr.xpBaseAddress);
}
-void swr_store_render_target(struct swr_context *ctx,
+void swr_invalidate_render_target(struct pipe_context *pipe,
+ uint32_t attachment,
+ uint16_t width, uint16_t height);
+
+void swr_store_render_target(struct pipe_context *pipe,
uint32_t attachment,
enum SWR_TILE_STATE post_tile_state);
+
+void swr_store_dirty_resource(struct pipe_context *pipe,
+ struct pipe_resource *resource,
+ enum SWR_TILE_STATE post_tile_state);
+
+void swr_update_resource_status(struct pipe_context *,
+ const struct pipe_draw_info *);
+
+/*
+ * Functions to indicate a resource's in-use status.
+ */
+static INLINE enum
+swr_resource_status & operator|=(enum swr_resource_status & a,
+ enum swr_resource_status b) {
+ return (enum swr_resource_status &)((int&)a |= (int)b);
+}
+
+static INLINE void
+swr_resource_read(struct pipe_resource *resource)
+{
+ swr_resource(resource)->status |= SWR_RESOURCE_READ;
+}
+
+static INLINE void
+swr_resource_write(struct pipe_resource *resource)
+{
+ swr_resource(resource)->status |= SWR_RESOURCE_WRITE;
+}
+
+static INLINE void
+swr_resource_unused(struct pipe_resource *resource)
+{
+ swr_resource(resource)->status = SWR_RESOURCE_UNUSED;
+}
+
#endif