assert(!rsc->write_batch);
}
+static void
+fd_invalidate_resource(struct pipe_context *pctx, struct pipe_resource *prsc)
+{
+ struct fd_resource *rsc = fd_resource(prsc);
+
+ /*
+ * TODO I guess we could track that the resource is invalidated and
+ * use that as a hint to realloc rather than stall in _transfer_map(),
+ * even in the non-DISCARD_WHOLE_RESOURCE case?
+ */
+
+ if (rsc->write_batch) {
+ struct fd_batch *batch = rsc->write_batch;
+ struct pipe_framebuffer_state *pfb = &batch->framebuffer;
+
+ if (pfb->zsbuf && pfb->zsbuf->texture == prsc)
+ batch->resolve &= ~(FD_BUFFER_DEPTH | FD_BUFFER_STENCIL);
+
+ for (unsigned i = 0; i < pfb->nr_cbufs; i++) {
+ if (pfb->cbufs[i] && pfb->cbufs[i]->texture == prsc) {
+ batch->resolve &= ~(PIPE_CLEAR_COLOR0 << i);
+ }
+ }
+ }
+}
+
void
fd_resource_screen_init(struct pipe_screen *pscreen)
{
pctx->resource_copy_region = fd_resource_copy_region;
pctx->blit = fd_blit;
pctx->flush_resource = fd_flush_resource;
+ pctx->invalidate_resource = fd_invalidate_resource;
}
case PIPE_CAP_STRING_MARKER:
case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
case PIPE_CAP_TEXTURE_BARRIER:
+ case PIPE_CAP_INVALIDATE_BUFFER:
return 1;
case PIPE_CAP_VERTEXID_NOBASE:
case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
- case PIPE_CAP_INVALIDATE_BUFFER:
case PIPE_CAP_GENERATE_MIPMAP:
case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: