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