projects
/
mesa.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
b04470b
)
nv50: create textures with nouveau_bo, for flexibility with tiling later
author
Ben Skeggs
<bskeggs@redhat.com>
Fri, 5 Jun 2009 10:32:32 +0000
(20:32 +1000)
committer
Ben Skeggs
<bskeggs@redhat.com>
Fri, 5 Jun 2009 12:53:23 +0000
(22:53 +1000)
src/gallium/drivers/nv50/nv50_context.h
patch
|
blob
|
history
src/gallium/drivers/nv50/nv50_miptree.c
patch
|
blob
|
history
src/gallium/drivers/nv50/nv50_state_validate.c
patch
|
blob
|
history
src/gallium/drivers/nv50/nv50_surface.c
patch
|
blob
|
history
src/gallium/drivers/nv50/nv50_tex.c
patch
|
blob
|
history
src/gallium/drivers/nv50/nv50_transfer.c
patch
|
blob
|
history
diff --git
a/src/gallium/drivers/nv50/nv50_context.h
b/src/gallium/drivers/nv50/nv50_context.h
index 7b67a7543978e643bc39e4fa7c39e960e45ced6f..c3ffdcca9f6c0cbbae4b05ea75a3227b1a085e52 100644
(file)
--- a/
src/gallium/drivers/nv50/nv50_context.h
+++ b/
src/gallium/drivers/nv50/nv50_context.h
@@
-70,7
+70,8
@@
struct nv50_miptree_level {
struct nv50_miptree {
struct pipe_texture base;
struct nv50_miptree {
struct pipe_texture base;
- struct pipe_buffer *buffer;
+
+ struct nouveau_bo *bo;
struct nv50_miptree_level level[PIPE_MAX_TEXTURE_LEVELS];
int image_nr;
struct nv50_miptree_level level[PIPE_MAX_TEXTURE_LEVELS];
int image_nr;
@@
-93,13
+94,6
@@
nv50_surface(struct pipe_surface *pt)
return (struct nv50_surface *)pt;
}
return (struct nv50_surface *)pt;
}
-static INLINE struct pipe_buffer *
-nv50_surface_buffer(struct pipe_surface *surface)
-{
- struct nv50_miptree *mt = (struct nv50_miptree *)surface->texture;
- return mt->buffer;
-}
-
struct nv50_state {
unsigned dirty;
struct nv50_state {
unsigned dirty;
diff --git
a/src/gallium/drivers/nv50/nv50_miptree.c
b/src/gallium/drivers/nv50/nv50_miptree.c
index f79a7ca86c9d96a85c07e9bea7ef12e6a1e541b8..2fbedb6779a0700a7442ced54f70a6173b46bf66 100644
(file)
--- a/
src/gallium/drivers/nv50/nv50_miptree.c
+++ b/
src/gallium/drivers/nv50/nv50_miptree.c
@@
-29,23
+29,25
@@
static struct pipe_texture *
nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
{
static struct pipe_texture *
nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
{
+ struct nouveau_device *dev = nouveau_screen(pscreen)->device;
struct nv50_miptree *mt = CALLOC_STRUCT(nv50_miptree);
struct pipe_texture *pt = &mt->base;
struct nv50_miptree *mt = CALLOC_STRUCT(nv50_miptree);
struct pipe_texture *pt = &mt->base;
- unsigned
usage,
width = tmp->width[0], height = tmp->height[0];
+ unsigned width = tmp->width[0], height = tmp->height[0];
unsigned depth = tmp->depth[0];
unsigned depth = tmp->depth[0];
- int i, l;
+ uint32_t tile_mode = 0, tile_flags = 0;
+ int ret, i, l;
mt->base = *tmp;
pipe_reference_init(&mt->base.reference, 1);
mt->base.screen = pscreen;
mt->base = *tmp;
pipe_reference_init(&mt->base.reference, 1);
mt->base.screen = pscreen;
- usage = PIPE_BUFFER_USAGE_PIXEL;
switch (pt->format) {
case PIPE_FORMAT_Z24S8_UNORM:
case PIPE_FORMAT_Z16_UNORM:
switch (pt->format) {
case PIPE_FORMAT_Z24S8_UNORM:
case PIPE_FORMAT_Z16_UNORM:
-
usage |= NOUVEAU_BUFFER_USAGE_ZETA
;
+
tile_flags = 0x2800
;
break;
default:
break;
default:
+ tile_flags = 0x7000;
break;
}
break;
}
@@
-93,12
+95,13
@@
nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
}
}
}
}
- mt->buffer = pscreen->buffer_create(pscreen, 256, usage, mt->total_size);
- if (!mt->buffer) {
+ ret = nouveau_bo_new_tile(dev, NOUVEAU_BO_VRAM, 256, mt->total_size,
+ tile_mode, tile_flags, &mt->bo);
+ if (ret) {
FREE(mt);
return NULL;
}
FREE(mt);
return NULL;
}
-
+
return &mt->base;
}
return &mt->base;
}
@@
-106,6
+109,7
@@
static struct pipe_texture *
nv50_miptree_blanket(struct pipe_screen *pscreen, const struct pipe_texture *pt,
const unsigned *stride, struct pipe_buffer *pb)
{
nv50_miptree_blanket(struct pipe_screen *pscreen, const struct pipe_texture *pt,
const unsigned *stride, struct pipe_buffer *pb)
{
+ struct nouveau_bo *bo = nouveau_bo(pb);
struct nv50_miptree *mt;
/* Only supports 2D, non-mipmapped textures for the moment */
struct nv50_miptree *mt;
/* Only supports 2D, non-mipmapped textures for the moment */
@@
-124,7
+128,7
@@
nv50_miptree_blanket(struct pipe_screen *pscreen, const struct pipe_texture *pt,
mt->level[0].pitch = *stride;
mt->level[0].image_offset = CALLOC(1, sizeof(unsigned));
mt->level[0].pitch = *stride;
mt->level[0].image_offset = CALLOC(1, sizeof(unsigned));
-
pipe_buffer_reference(&mt->buffer, pb
);
+
nouveau_bo_ref(bo, &mt->bo
);
return &mt->base;
}
return &mt->base;
}
@@
-133,7
+137,7
@@
nv50_miptree_destroy(struct pipe_texture *pt)
{
struct nv50_miptree *mt = nv50_miptree(pt);
{
struct nv50_miptree *mt = nv50_miptree(pt);
-
pipe_buffer_reference(&mt->buffer, NULL
);
+
nouveau_bo_ref(NULL, &mt->bo
);
FREE(mt);
}
FREE(mt);
}
diff --git
a/src/gallium/drivers/nv50/nv50_state_validate.c
b/src/gallium/drivers/nv50/nv50_state_validate.c
index 9e70d4b78d1dc7bb9a5e52f3b3022706940d00e3..1788f764560b7a8e952c1d90bab3d15a2cc35eea 100644
(file)
--- a/
src/gallium/drivers/nv50/nv50_state_validate.c
+++ b/
src/gallium/drivers/nv50/nv50_state_validate.c
@@
-32,7
+32,8
@@
nv50_state_validate_fb(struct nv50_context *nv50)
unsigned i, w, h, gw = 0;
for (i = 0; i < fb->nr_cbufs; i++) {
unsigned i, w, h, gw = 0;
for (i = 0; i < fb->nr_cbufs; i++) {
- struct nouveau_bo *bo = nouveau_bo(nv50_surface_buffer(fb->cbufs[i]));
+ struct pipe_texture *pt = fb->cbufs[i]->texture;
+ struct nouveau_bo *bo = nv50_miptree(pt)->bo;
if (!gw) {
w = fb->cbufs[i]->width;
if (!gw) {
w = fb->cbufs[i]->width;
@@
-73,7
+74,8
@@
nv50_state_validate_fb(struct nv50_context *nv50)
}
if (fb->zsbuf) {
}
if (fb->zsbuf) {
- struct nouveau_bo *bo = nouveau_bo(nv50_surface_buffer(fb->zsbuf));
+ struct pipe_texture *pt = fb->zsbuf->texture;
+ struct nouveau_bo *bo = nv50_miptree(pt)->bo;
if (!gw) {
w = fb->zsbuf->width;
if (!gw) {
w = fb->zsbuf->width;
diff --git
a/src/gallium/drivers/nv50/nv50_surface.c
b/src/gallium/drivers/nv50/nv50_surface.c
index 936fe43561d18658ad3554326404c16adb41a4c7..8db3b6d344dd804ba0ff73926b3b0fd7cb4a6e24 100644
(file)
--- a/
src/gallium/drivers/nv50/nv50_surface.c
+++ b/
src/gallium/drivers/nv50/nv50_surface.c
@@
-54,7
+54,7
@@
nv50_surface_set(struct nv50_screen *screen, struct pipe_surface *ps, int dst)
struct nv50_miptree *mt = nv50_miptree(ps->texture);
struct nouveau_channel *chan = screen->eng2d->channel;
struct nouveau_grobj *eng2d = screen->eng2d;
struct nv50_miptree *mt = nv50_miptree(ps->texture);
struct nouveau_channel *chan = screen->eng2d->channel;
struct nouveau_grobj *eng2d = screen->eng2d;
- struct nouveau_bo *bo = n
ouveau_bo(nv50_miptree(ps->texture)->buffer)
;
+ struct nouveau_bo *bo = n
v50_miptree(ps->texture)->bo
;
int format, mthd = dst ? NV50_2D_DST_FORMAT : NV50_2D_SRC_FORMAT;
int flags = NOUVEAU_BO_VRAM | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD);
int format, mthd = dst ? NV50_2D_DST_FORMAT : NV50_2D_SRC_FORMAT;
int flags = NOUVEAU_BO_VRAM | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD);
diff --git
a/src/gallium/drivers/nv50/nv50_tex.c
b/src/gallium/drivers/nv50/nv50_tex.c
index 5539a796e8bd8217c50f72c352a5cba49649443f..8bb81392fd0a3f77df3718d2b11759181495476b 100644
(file)
--- a/
src/gallium/drivers/nv50/nv50_tex.c
+++ b/
src/gallium/drivers/nv50/nv50_tex.c
@@
-29,8
+29,6
@@
static int
nv50_tex_construct(struct nv50_context *nv50, struct nouveau_stateobj *so,
struct nv50_miptree *mt)
{
nv50_tex_construct(struct nv50_context *nv50, struct nouveau_stateobj *so,
struct nv50_miptree *mt)
{
- struct nouveau_bo *bo = nouveau_bo(mt->buffer);
-
switch (mt->base.format) {
case PIPE_FORMAT_A8R8G8B8_UNORM:
so_data(so, NV50TIC_0_0_MAPA_C3 | NV50TIC_0_0_TYPEA_UNORM |
switch (mt->base.format) {
case PIPE_FORMAT_A8R8G8B8_UNORM:
so_data(so, NV50TIC_0_0_MAPA_C3 | NV50TIC_0_0_TYPEA_UNORM |
@@
-120,9
+118,9
@@
nv50_tex_construct(struct nv50_context *nv50, struct nouveau_stateobj *so,
return 1;
}
return 1;
}
- so_reloc(so, bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_LOW |
+ so_reloc(so,
mt->
bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_LOW |
NOUVEAU_BO_RD, 0, 0);
NOUVEAU_BO_RD, 0, 0);
- so_data (so, 0xd0005000 | bo->tile_mode << 22);
+ so_data (so, 0xd0005000 |
mt->
bo->tile_mode << 22);
so_data (so, 0x00300000);
so_data (so, mt->base.width[0]);
so_data (so, (mt->base.last_level << 28) |
so_data (so, 0x00300000);
so_data (so, mt->base.width[0]);
so_data (so, (mt->base.last_level << 28) |
diff --git
a/src/gallium/drivers/nv50/nv50_transfer.c
b/src/gallium/drivers/nv50/nv50_transfer.c
index babb35a227a54f15db933b66e846493546980bd4..d0b7f0bef43900cce8f4126703b4bd05604764ce 100644
(file)
--- a/
src/gallium/drivers/nv50/nv50_transfer.c
+++ b/
src/gallium/drivers/nv50/nv50_transfer.c
@@
-6,7
+6,7
@@
struct nv50_transfer {
struct pipe_transfer base;
struct nv50_transfer {
struct pipe_transfer base;
- struct
pipe_buffer *buffer
;
+ struct
nouveau_bo *bo
;
unsigned level_offset;
int level_pitch;
int level_width;
unsigned level_offset;
int level_pitch;
int level_width;
@@
-16,9
+16,9
@@
struct nv50_transfer {
};
static void
};
static void
-nv50_transfer_rect_m2mf(struct pipe_screen *pscreen, struct
pipe_buffer *src
,
+nv50_transfer_rect_m2mf(struct pipe_screen *pscreen, struct
nouveau_bo *src_bo
,
unsigned src_offset, int src_pitch, int sx, int sy,
unsigned src_offset, int src_pitch, int sx, int sy,
- int sw, int sh, struct
pipe_buffer *dst
,
+ int sw, int sh, struct
nouveau_bo *dst_bo
,
unsigned dst_offset, int dst_pitch, int dx, int dy,
int dw, int dh, int cpp, int width, int height,
unsigned src_reloc, unsigned dst_reloc)
unsigned dst_offset, int dst_pitch, int dx, int dy,
int dw, int dh, int cpp, int width, int height,
unsigned src_reloc, unsigned dst_reloc)
@@
-26,8
+26,6
@@
nv50_transfer_rect_m2mf(struct pipe_screen *pscreen, struct pipe_buffer *src,
struct nv50_screen *screen = nv50_screen(pscreen);
struct nouveau_channel *chan = screen->m2mf->channel;
struct nouveau_grobj *m2mf = screen->m2mf;
struct nv50_screen *screen = nv50_screen(pscreen);
struct nouveau_channel *chan = screen->m2mf->channel;
struct nouveau_grobj *m2mf = screen->m2mf;
- struct nouveau_bo *src_bo = nouveau_bo(src);
- struct nouveau_bo *dst_bo = nouveau_bo(dst);
src_reloc |= NOUVEAU_BO_RD;
dst_reloc |= NOUVEAU_BO_WR;
src_reloc |= NOUVEAU_BO_RD;
dst_reloc |= NOUVEAU_BO_WR;
@@
-107,10
+105,12
@@
nv50_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
enum pipe_transfer_usage usage,
unsigned x, unsigned y, unsigned w, unsigned h)
{
enum pipe_transfer_usage usage,
unsigned x, unsigned y, unsigned w, unsigned h)
{
+ struct nouveau_device *dev = nouveau_screen(pscreen)->device;
struct nv50_miptree *mt = nv50_miptree(pt);
struct nv50_miptree_level *lvl = &mt->level[level];
struct nv50_transfer *tx;
unsigned image = 0;
struct nv50_miptree *mt = nv50_miptree(pt);
struct nv50_miptree_level *lvl = &mt->level[level];
struct nv50_transfer *tx;
unsigned image = 0;
+ int ret;
if (pt->target == PIPE_TEXTURE_CUBE)
image = face;
if (pt->target == PIPE_TEXTURE_CUBE)
image = face;
@@
-138,14
+138,17
@@
nv50_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
tx->level_offset = lvl->image_offset[image];
tx->level_x = x;
tx->level_y = y;
tx->level_offset = lvl->image_offset[image];
tx->level_x = x;
tx->level_y = y;
- tx->buffer =
- pipe_buffer_create(pscreen, 0, NOUVEAU_BUFFER_USAGE_TRANSFER,
- w * tx->base.block.size * h);
+ ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0,
+ w * pt->block.size * h, &tx->bo);
+ if (ret) {
+ FREE(tx);
+ return NULL;
+ }
if (usage != PIPE_TRANSFER_WRITE) {
if (usage != PIPE_TRANSFER_WRITE) {
- nv50_transfer_rect_m2mf(pscreen, mt->b
uffer
, tx->level_offset,
+ nv50_transfer_rect_m2mf(pscreen, mt->b
o
, tx->level_offset,
tx->level_pitch, x, y, tx->level_width,
tx->level_pitch, x, y, tx->level_width,
- tx->level_height, tx->b
uffer
, 0,
+ tx->level_height, tx->b
o
, 0,
tx->base.stride, 0, 0,
tx->base.width, tx->base.height,
tx->base.block.size, w, h,
tx->base.stride, 0, 0,
tx->base.width, tx->base.height,
tx->base.block.size, w, h,
@@
-164,9
+167,9
@@
nv50_transfer_del(struct pipe_transfer *ptx)
if (ptx->usage != PIPE_TRANSFER_READ) {
struct pipe_screen *pscreen = ptx->texture->screen;
if (ptx->usage != PIPE_TRANSFER_READ) {
struct pipe_screen *pscreen = ptx->texture->screen;
- nv50_transfer_rect_m2mf(pscreen, tx->b
uffer
, 0, tx->base.stride,
+ nv50_transfer_rect_m2mf(pscreen, tx->b
o
, 0, tx->base.stride,
0, 0, tx->base.width, tx->base.height,
0, 0, tx->base.width, tx->base.height,
- mt->b
uffer
, tx->level_offset,
+ mt->b
o
, tx->level_offset,
tx->level_pitch, tx->level_x,
tx->level_y, tx->level_width,
tx->level_height, tx->base.block.size,
tx->level_pitch, tx->level_x,
tx->level_y, tx->level_width,
tx->level_height, tx->base.block.size,
@@
-175,7
+178,7
@@
nv50_transfer_del(struct pipe_transfer *ptx)
NOUVEAU_BO_GART);
}
NOUVEAU_BO_GART);
}
-
pipe_buffer_reference(&tx->buffer, NULL
);
+
nouveau_bo_ref(NULL, &tx->bo
);
pipe_texture_reference(&ptx->texture, NULL);
FREE(ptx);
}
pipe_texture_reference(&ptx->texture, NULL);
FREE(ptx);
}
@@
-185,13
+188,17
@@
nv50_transfer_map(struct pipe_screen *pscreen, struct pipe_transfer *ptx)
{
struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
unsigned flags = 0;
{
struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
unsigned flags = 0;
+ int ret;
if (ptx->usage & PIPE_TRANSFER_WRITE)
if (ptx->usage & PIPE_TRANSFER_WRITE)
- flags |=
PIPE_BUFFER_USAGE_CPU_WRITE
;
+ flags |=
NOUVEAU_BO_WR
;
if (ptx->usage & PIPE_TRANSFER_READ)
if (ptx->usage & PIPE_TRANSFER_READ)
- flags |=
PIPE_BUFFER_USAGE_CPU_REA
D;
+ flags |=
NOUVEAU_BO_R
D;
- return pipe_buffer_map(pscreen, tx->buffer, flags);
+ ret = nouveau_bo_map(tx->bo, flags);
+ if (ret)
+ return NULL;
+ return tx->bo->map;
}
static void
}
static void
@@
-199,7
+206,7
@@
nv50_transfer_unmap(struct pipe_screen *pscreen, struct pipe_transfer *ptx)
{
struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
{
struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
-
pipe_buffer_unmap(pscreen, tx->buffer
);
+
nouveau_bo_unmap(tx->bo
);
}
void
}
void