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