nv50: hehe, damage from tex-surfaces.. surface_fill() reenabled now :)
[mesa.git] / src / gallium / drivers / nv50 / nv50_miptree.c
1 #include "pipe/p_state.h"
2 #include "pipe/p_defines.h"
3 #include "pipe/p_util.h"
4 #include "pipe/p_inlines.h"
5
6 #include "nv50_context.h"
7
8 struct nv50_miptree {
9 struct pipe_texture base;
10 struct pipe_buffer *buffer;
11 };
12
13 static INLINE struct nv50_miptree *
14 nv50_miptree(struct pipe_texture *pt)
15 {
16 return (struct nv50_miptree *)pt;
17 }
18
19 static struct pipe_texture *
20 nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
21 {
22 struct pipe_winsys *ws = pscreen->winsys;
23 struct nv50_miptree *mt = CALLOC_STRUCT(nv50_miptree);
24
25 NOUVEAU_ERR("unimplemented\n");
26
27 mt->base = *pt;
28 mt->base.refcount = 1;
29 mt->base.screen = pscreen;
30
31 mt->buffer = ws->buffer_create(ws, 256, PIPE_BUFFER_USAGE_PIXEL,
32 pt->width[0] * pt->cpp * pt->height[0]);
33 if (!mt->buffer) {
34 FREE(mt);
35 return NULL;
36 }
37
38 return &mt->base;
39 }
40
41 static void
42 nv50_miptree_release(struct pipe_screen *pscreen, struct pipe_texture **ppt)
43 {
44 struct pipe_winsys *ws = pscreen->winsys;
45 struct pipe_texture *pt = *ppt;
46
47 NOUVEAU_ERR("unimplemented\n");
48
49 *ppt = NULL;
50 if (--pt->refcount <= 0) {
51 struct nv50_miptree *mt = nv50_miptree(pt);
52
53 pipe_buffer_reference(ws, &mt->buffer, NULL);
54 FREE(mt);
55 }
56 }
57
58 static struct pipe_surface *
59 nv50_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
60 unsigned face, unsigned level, unsigned zslice,
61 unsigned flags)
62 {
63 struct pipe_winsys *ws = pscreen->winsys;
64 struct nv50_miptree *mt = nv50_miptree(pt);
65 struct pipe_surface *ps;
66
67 NOUVEAU_ERR("unimplemented\n");
68
69 ps = ws->surface_alloc(ws);
70 if (!ps)
71 return NULL;
72
73 pipe_buffer_reference(ws, &ps->buffer, mt->buffer);
74 ps->format = pt->format;
75 ps->width = pt->width[level];
76 ps->height = pt->height[level];
77 ps->block = pt->block;
78 ps->nblocksx = pt->nblocksx[level];
79 ps->nblocksy = pt->nblocksy[level];
80 ps->stride = ps->width * ps->block.size;
81 ps->offset = 0;
82
83 return ps;
84 }
85
86 static void
87 nv50_miptree_surface_del(struct pipe_screen *pscreen,
88 struct pipe_surface **psurface)
89 {
90 }
91
92 void
93 nv50_screen_init_miptree_functions(struct pipe_screen *pscreen)
94 {
95 pscreen->texture_create = nv50_miptree_create;
96 pscreen->texture_release = nv50_miptree_release;
97 pscreen->get_tex_surface = nv50_miptree_surface_new;
98 pscreen->tex_surface_release = nv50_miptree_surface_del;
99 }
100