179079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs#ifndef __NOUVEAU_BUFFER_H__ 279079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs#define __NOUVEAU_BUFFER_H__ 35c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 45c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs#include "util/u_transfer.h" 55c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs#include "util/u_double_list.h" 65c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 75c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsstruct pipe_resource; 81ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggsstruct nouveau_context; 95c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsstruct nouveau_bo; 105c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 115c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs/* DIRTY: buffer was (or will be after the next flush) written to by GPU and 125c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs * resource->data has not been updated to reflect modified VRAM contents 135c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs * 145c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs * USER_MEMORY: resource->data is a pointer to client memory and may change 155c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs * between GL calls 165c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs */ 17be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs#define NOUVEAU_BUFFER_STATUS_GPU_READING (1 << 0) 18be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs#define NOUVEAU_BUFFER_STATUS_GPU_WRITING (1 << 1) 195c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs#define NOUVEAU_BUFFER_STATUS_USER_MEMORY (1 << 7) 205c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 215c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs/* Resources, if mapped into the GPU's address space, are guaranteed to 225c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs * have constant virtual addresses (nv50+). 235c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs * 245c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs * The address of a resource will lie within the nouveau_bo referenced, 255c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs * and this bo should be added to the memory manager's validation list. 265c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs */ 275c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsstruct nv04_resource { 285c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs struct pipe_resource base; 295c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs const struct u_resource_vtbl *vtbl; 305c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 316d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller uint64_t address; /* virtual address (nv50+) */ 326d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 335c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs uint8_t *data; 345c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs struct nouveau_bo *bo; 355c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs uint32_t offset; 365c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 375c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs uint8_t status; 385c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs uint8_t domain; 395c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 405c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs struct nouveau_fence *fence; 415c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs struct nouveau_fence *fence_wr; 425c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 435c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs struct nouveau_mm_allocation *mm; 445c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs}; 455c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 465c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsvoid 475c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsnouveau_buffer_release_gpu_storage(struct nv04_resource *); 485c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 495c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsboolean 501ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggsnouveau_buffer_download(struct nouveau_context *, struct nv04_resource *, 515c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs unsigned start, unsigned size); 525c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 535c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsboolean 541ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggsnouveau_buffer_migrate(struct nouveau_context *, 555c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs struct nv04_resource *, unsigned domain); 565c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 576d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumillervoid * 586d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumillernouveau_resource_map_offset(struct nouveau_context *, struct nv04_resource *, 596d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller uint32_t offset, uint32_t flags); 605c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 615c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsstatic INLINE void 625c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsnouveau_resource_unmap(struct nv04_resource *res) 635c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs{ 645c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs /* no-op */ 655c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs} 665c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 675c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsstatic INLINE struct nv04_resource * 685c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsnv04_resource(struct pipe_resource *resource) 695c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs{ 705c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs return (struct nv04_resource *)resource; 715c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs} 725c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 735c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs/* is resource mapped into the GPU's address space (i.e. VRAM or GART) ? */ 745c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsstatic INLINE boolean 755c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsnouveau_resource_mapped_by_gpu(struct pipe_resource *resource) 765c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs{ 775c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs return nv04_resource(resource)->domain != 0; 785c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs} 795c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 805c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsstruct pipe_resource * 815c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsnouveau_buffer_create(struct pipe_screen *pscreen, 825c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs const struct pipe_resource *templ); 835c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 845c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsstruct pipe_resource * 855c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsnouveau_user_buffer_create(struct pipe_screen *screen, void *ptr, 865c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs unsigned bytes, unsigned usage); 875c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 885c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggsboolean 896d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumillernouveau_user_buffer_upload(struct nouveau_context *, struct nv04_resource *, 906d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller unsigned base, unsigned size); 915c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs 92e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller/* Copy data to a scratch buffer and return address & bo the data resides in. 93e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller * Returns 0 on failure. 94680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller */ 95e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumilleruint64_t 96680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumillernouveau_scratch_data(struct nouveau_context *, 97e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller const void *data, unsigned base, unsigned size, 98e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller struct nouveau_bo **); 99680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller 1005c1c4f8593073c0bad9bada9234657dda1b25ff0Ben Skeggs#endif 101