1 #include "pipe/p_state.h"
2 #include "pipe/p_defines.h"
3 #include "pipe/p_util.h"
4 #include "pipe/p_inlines.h"
6 #include "nv50_context.h"
8 static struct pipe_texture
*
9 nv50_miptree_create(struct pipe_screen
*pscreen
, const struct pipe_texture
*pt
)
11 struct pipe_winsys
*ws
= pscreen
->winsys
;
12 struct nv50_miptree
*mt
= CALLOC_STRUCT(nv50_miptree
);
13 unsigned usage
, pitch
;
16 mt
->base
.refcount
= 1;
17 mt
->base
.screen
= pscreen
;
19 usage
= PIPE_BUFFER_USAGE_PIXEL
;
21 case PIPE_FORMAT_Z24S8_UNORM
:
22 case PIPE_FORMAT_Z16_UNORM
:
23 usage
|= NOUVEAU_BUFFER_USAGE_ZETA
;
29 pitch
= ((pt
->width
[0] + 63) & ~63) * pt
->block
.size
;
31 mt
->buffer
= ws
->buffer_create(ws
, 256, usage
, pitch
* pt
->height
[0]);
41 nv50_miptree_release(struct pipe_screen
*pscreen
, struct pipe_texture
**ppt
)
43 struct pipe_winsys
*ws
= pscreen
->winsys
;
44 struct pipe_texture
*pt
= *ppt
;
48 if (--pt
->refcount
<= 0) {
49 struct nv50_miptree
*mt
= nv50_miptree(pt
);
51 pipe_buffer_reference(ws
, &mt
->buffer
, NULL
);
56 static struct pipe_surface
*
57 nv50_miptree_surface_new(struct pipe_screen
*pscreen
, struct pipe_texture
*pt
,
58 unsigned face
, unsigned level
, unsigned zslice
,
61 struct pipe_winsys
*ws
= pscreen
->winsys
;
62 struct nv50_miptree
*mt
= nv50_miptree(pt
);
63 struct pipe_surface
*ps
;
65 ps
= CALLOC_STRUCT(pipe_surface
);
68 ps
->format
= pt
->format
;
69 ps
->width
= pt
->width
[level
];
70 ps
->height
= pt
->height
[level
];
71 ps
->block
= pt
->block
;
72 ps
->nblocksx
= pt
->nblocksx
[level
];
73 ps
->nblocksy
= pt
->nblocksy
[level
];
74 ps
->stride
= ps
->width
* ps
->block
.size
;
77 ps
->status
= PIPE_SURFACE_STATUS_DEFINED
;
79 pipe_texture_reference(&ps
->texture
, pt
);
80 pipe_buffer_reference(ws
, &ps
->buffer
, mt
->buffer
);
86 nv50_miptree_surface_del(struct pipe_screen
*pscreen
,
87 struct pipe_surface
**psurface
)
89 struct pipe_winsys
*ws
= pscreen
->winsys
;
90 struct pipe_surface
*surf
= *psurface
;
94 if (--surf
->refcount
<= 0) {
95 pipe_texture_reference(&surf
->texture
, NULL
);
96 pipe_buffer_reference(ws
, &surf
->buffer
, NULL
);
102 nv50_screen_init_miptree_functions(struct pipe_screen
*pscreen
)
104 pscreen
->texture_create
= nv50_miptree_create
;
105 pscreen
->texture_release
= nv50_miptree_release
;
106 pscreen
->get_tex_surface
= nv50_miptree_surface_new
;
107 pscreen
->tex_surface_release
= nv50_miptree_surface_del
;