1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef __NOUVEAU_BUFFER_H__ 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __NOUVEAU_BUFFER_H__ 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_transfer.h" 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_double_list.h" 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_resource; 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct nouveau_context; 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct nouveau_bo; 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DIRTY: buffer was (or will be after the next flush) written to by GPU and 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * resource->data has not been updated to reflect modified VRAM contents 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USER_MEMORY: resource->data is a pointer to client memory and may change 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * between GL calls 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NOUVEAU_BUFFER_STATUS_GPU_READING (1 << 0) 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NOUVEAU_BUFFER_STATUS_GPU_WRITING (1 << 1) 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NOUVEAU_BUFFER_STATUS_USER_MEMORY (1 << 7) 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Resources, if mapped into the GPU's address space, are guaranteed to 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * have constant virtual addresses (nv50+). 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The address of a resource will lie within the nouveau_bo referenced, 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and this bo should be added to the memory manager's validation list. 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct nv04_resource { 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource base; 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct u_resource_vtbl *vtbl; 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t address; /* virtual address (nv50+) */ 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *data; 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *bo; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t offset; 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t status; 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t domain; 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_fence *fence; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_fence *fence_wr; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_mm_allocation *mm; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_buffer_release_gpu_storage(struct nv04_resource *); 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_buffer_download(struct nouveau_context *, struct nv04_resource *, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, unsigned size); 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_buffer_migrate(struct nouveau_context *, 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *, unsigned domain); 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid * 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_resource_map_offset(struct nouveau_context *, struct nv04_resource *, 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t offset, uint32_t flags); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_resource_unmap(struct nv04_resource *res) 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no-op */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct nv04_resource * 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv04_resource(struct pipe_resource *resource) 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct nv04_resource *)resource; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* is resource mapped into the GPU's address space (i.e. VRAM or GART) ? */ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_resource_mapped_by_gpu(struct pipe_resource *resource) 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv04_resource(resource)->domain != 0; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_resource * 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_buffer_create(struct pipe_screen *pscreen, 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_resource *templ); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_resource * 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_user_buffer_create(struct pipe_screen *screen, void *ptr, 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bytes, unsigned usage); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_user_buffer_upload(struct nouveau_context *, struct nv04_resource *, 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned base, unsigned size); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Copy data to a scratch buffer and return address & bo the data resides in. 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Returns 0 on failure. 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint64_t 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_scratch_data(struct nouveau_context *, 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *data, unsigned base, unsigned size, 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo **); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 101