Signed-off-by: Francisco Jerez <curroje...@riseup.net> --- >[...] > Coincidentally nouveau's texture handling has always been structured > around two teximage map/unmap hooks (e.g. compare nouveau_teximage() and > the look of _mesa_store_teximage2d() after the API change), and AFAICT > the changes would be for the most part trivial, but still, if no-one > else wants or knows how to do it (isn't fixing up the drivers the > responsibility of whoever changes the API?), I'll get back to it as soon > as I can.
There it goes... src/mesa/drivers/dri/nouveau/nouveau_context.c | 2 - src/mesa/drivers/dri/nouveau/nouveau_driver.h | 2 + src/mesa/drivers/dri/nouveau/nouveau_span.c | 17 -- src/mesa/drivers/dri/nouveau/nouveau_texture.c | 258 +++++++++--------------- src/mesa/drivers/dri/nouveau/nouveau_texture.h | 2 +- 5 files changed, 94 insertions(+), 187 deletions(-) diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c index 22b9957..5813f10 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c @@ -35,8 +35,6 @@ #include "main/state.h" #include "drivers/common/meta.h" #include "drivers/common/driverfuncs.h" -#include "swrast/swrast.h" -#include "swrast/s_context.h" #include "vbo/vbo.h" #include "tnl/tnl.h" #include "tnl/t_context.h" diff --git a/src/mesa/drivers/dri/nouveau/nouveau_driver.h b/src/mesa/drivers/dri/nouveau/nouveau_driver.h index 0018eec..4d7ac1d 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_driver.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_driver.h @@ -32,6 +32,8 @@ #include "main/macros.h" #include "main/formats.h" #include "main/state.h" +#include "swrast/swrast.h" +#include "swrast/s_context.h" #include "utils.h" #include "dri_util.h" diff --git a/src/mesa/drivers/dri/nouveau/nouveau_span.c b/src/mesa/drivers/dri/nouveau/nouveau_span.c index 761cc76..3e58e65 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_span.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_span.c @@ -131,18 +131,6 @@ renderbuffer_map_unmap(struct gl_renderbuffer *rb, GLboolean map) } static void -texture_unit_map_unmap(struct gl_context *ctx, struct gl_texture_unit *u, GLboolean map) -{ - if (!u->_ReallyEnabled) - return; - - if (map) - ctx->Driver.MapTexture(ctx, u->_Current); - else - ctx->Driver.UnmapTexture(ctx, u->_Current); -} - -static void framebuffer_map_unmap(struct gl_framebuffer *fb, GLboolean map) { int i; @@ -159,15 +147,10 @@ framebuffer_map_unmap(struct gl_framebuffer *fb, GLboolean map) static void span_map_unmap(struct gl_context *ctx, GLboolean map) { - int i; - framebuffer_map_unmap(ctx->DrawBuffer, map); if (ctx->ReadBuffer != ctx->DrawBuffer) framebuffer_map_unmap(ctx->ReadBuffer, map); - - for (i = 0; i < ctx->Const.MaxTextureUnits; i++) - texture_unit_map_unmap(ctx, &ctx->Texture.Unit[i], map); } static void diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c index 993afa6..5fbfcc5 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_texture.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.c @@ -37,7 +37,6 @@ #include "main/texcompress.h" #include "main/texgetimage.h" #include "main/mipmap.h" -#include "main/texfetch.h" #include "main/teximage.h" #include "drivers/common/meta.h" @@ -68,11 +67,39 @@ nouveau_teximage_new(struct gl_context *ctx) { struct nouveau_teximage *nti = CALLOC_STRUCT(nouveau_teximage); - return &nti->base; + return &nti->base.Base; +} + +static unsigned +get_teximage_placement(struct gl_texture_image *ti) +{ + if (ti->TexFormat == MESA_FORMAT_A8 || + ti->TexFormat == MESA_FORMAT_L8 || + ti->TexFormat == MESA_FORMAT_I8) + /* 1 cpp formats will have to be swizzled by the CPU, + * so leave them in system RAM for now. */ + return NOUVEAU_BO_MAP; + else + return NOUVEAU_BO_GART | NOUVEAU_BO_MAP; +} + +static GLboolean +nouveau_teximage_buffer_alloc(struct gl_context *ctx, + struct gl_texture_image *ti, + gl_format format, GLsizei width, + GLsizei height, GLsizei depth) +{ + struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; + + nouveau_surface_alloc(ctx, s, LINEAR, get_teximage_placement(ti), + format, width, height); + + return GL_TRUE; } static void -nouveau_teximage_free(struct gl_context *ctx, struct gl_texture_image *ti) +nouveau_teximage_buffer_free(struct gl_context *ctx, + struct gl_texture_image *ti) { struct nouveau_teximage *nti = to_nouveau_teximage(ti); @@ -81,51 +108,52 @@ nouveau_teximage_free(struct gl_context *ctx, struct gl_texture_image *ti) static void nouveau_teximage_map(struct gl_context *ctx, struct gl_texture_image *ti, - int access, int x, int y, int w, int h) + GLuint slice, GLuint x, GLuint y, GLuint w, GLuint h, + GLbitfield access, GLubyte **pmap, GLint *pstride) { struct nouveau_teximage *nti = to_nouveau_teximage(ti); struct nouveau_surface *s = &nti->surface; struct nouveau_surface *st = &nti->transfer.surface; - if (s->bo) { - if (!(access & GL_MAP_READ_BIT) && - nouveau_bo_pending(s->bo)) { - /* - * Heuristic: use a bounce buffer to pipeline - * teximage transfers. - */ - st->layout = LINEAR; - st->format = s->format; - st->cpp = s->cpp; - st->width = w; - st->height = h; - st->pitch = s->pitch; - nti->transfer.x = x; - nti->transfer.y = y; - - ti->Data = nouveau_get_scratch(ctx, st->pitch * h, - &st->bo, &st->offset); - - } else { - int ret, flags = 0; - - if (access & GL_MAP_READ_BIT) - flags |= NOUVEAU_BO_RD; - if (access & GL_MAP_WRITE_BIT) - flags |= NOUVEAU_BO_WR; - - if (!s->bo->map) { - ret = nouveau_bo_map(s->bo, flags); - assert(!ret); - } - - ti->Data = s->bo->map + y * s->pitch + x * s->cpp; + if (!(access & GL_MAP_READ_BIT) && + nouveau_bo_pending(s->bo)) { + /* + * Heuristic: use a bounce buffer to pipeline + * teximage transfers. + */ + st->layout = LINEAR; + st->format = s->format; + st->cpp = s->cpp; + st->width = w; + st->height = h; + st->pitch = s->pitch; + nti->transfer.x = x; + nti->transfer.y = y; + + *pmap = nouveau_get_scratch(ctx, st->pitch * h, + &st->bo, &st->offset); + } else { + int ret, flags = 0; + + if (access & GL_MAP_READ_BIT) + flags |= NOUVEAU_BO_RD; + if (access & GL_MAP_WRITE_BIT) + flags |= NOUVEAU_BO_WR; + + if (!s->bo->map) { + ret = nouveau_bo_map(s->bo, flags); + assert(!ret); } + + *pmap = s->bo->map + y * s->pitch + x * s->cpp; } + + *pstride = s->pitch; } static void -nouveau_teximage_unmap(struct gl_context *ctx, struct gl_texture_image *ti) +nouveau_teximage_unmap(struct gl_context *ctx, struct gl_texture_image *ti, + GLuint slice) { struct nouveau_teximage *nti = to_nouveau_teximage(ti); struct nouveau_surface *s = &nti->surface; @@ -137,11 +165,9 @@ nouveau_teximage_unmap(struct gl_context *ctx, struct gl_texture_image *ti) st->width, st->height); nouveau_surface_ref(NULL, st); - } else if (s->bo) { + } else { nouveau_bo_unmap(s->bo); } - - ti->Data = NULL; } static gl_format @@ -368,19 +394,6 @@ nouveau_texture_reallocate(struct gl_context *ctx, struct gl_texture_object *t) } } -static unsigned -get_teximage_placement(struct gl_texture_image *ti) -{ - if (ti->TexFormat == MESA_FORMAT_A8 || - ti->TexFormat == MESA_FORMAT_L8 || - ti->TexFormat == MESA_FORMAT_I8) - /* 1 cpp formats will have to be swizzled by the CPU, - * so leave them in system RAM for now. */ - return NOUVEAU_BO_MAP; - else - return NOUVEAU_BO_GART | NOUVEAU_BO_MAP; -} - static void nouveau_teximage(struct gl_context *ctx, GLint dims, GLenum target, GLint level, GLint internalFormat, @@ -391,30 +404,27 @@ nouveau_teximage(struct gl_context *ctx, GLint dims, GLenum target, GLint level, struct gl_texture_image *ti) { struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; - int ret; + unsigned char *map; + int stride, ret; /* Allocate a new bo for the image. */ - nouveau_surface_alloc(ctx, s, LINEAR, get_teximage_placement(ti), - ti->TexFormat, width, height); - ti->RowStride = s->pitch / s->cpp; - + nouveau_teximage_buffer_alloc(ctx, ti, ti->TexFormat, width, height, + depth); pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format, type, pixels, packing, "glTexImage"); if (pixels) { /* Store the pixel data. */ - nouveau_teximage_map(ctx, ti, GL_MAP_WRITE_BIT, - 0, 0, width, height); + nouveau_teximage_map(ctx, ti, 0, 0, 0, width, height, + GL_MAP_WRITE_BIT, &map, &stride); ret = _mesa_texstore(ctx, dims, ti->_BaseFormat, - ti->TexFormat, ti->Data, - 0, 0, 0, s->pitch, - ti->ImageOffsets, - width, height, depth, + ti->TexFormat, map, 0, 0, 0, stride, + (unsigned []) { 0 }, width, height, depth, format, type, pixels, packing); assert(ret); - nouveau_teximage_unmap(ctx, ti); + nouveau_teximage_unmap(ctx, ti, 0); _mesa_unmap_teximage_pbo(ctx, packing); if (!validate_teximage(ctx, t, level, 0, 0, 0, @@ -485,22 +495,24 @@ nouveau_texsubimage(struct gl_context *ctx, GLint dims, GLenum target, GLint lev struct gl_texture_image *ti) { struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; - int ret; + unsigned char *map; + int stride, ret; pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format, type, pixels, packing, "glTexSubImage"); if (pixels) { - nouveau_teximage_map(ctx, ti, GL_MAP_WRITE_BIT, - xoffset, yoffset, width, height); + nouveau_teximage_map(ctx, ti, 0, xoffset, yoffset, + width, height, GL_MAP_WRITE_BIT, + &map, &stride); - ret = _mesa_texstore(ctx, 3, ti->_BaseFormat, ti->TexFormat, - ti->Data, 0, 0, 0, s->pitch, - ti->ImageOffsets, width, height, depth, + ret = _mesa_texstore(ctx, 3, ti->_BaseFormat, + ti->TexFormat, map, 0, 0, 0, stride, + (unsigned []) { 0 }, width, height, depth, format, type, pixels, packing); assert(ret); - nouveau_teximage_unmap(ctx, ti); + nouveau_teximage_unmap(ctx, ti, 0); _mesa_unmap_teximage_pbo(ctx, packing); } @@ -551,19 +563,6 @@ nouveau_texsubimage_1d(struct gl_context *ctx, GLenum target, GLint level, } static void -nouveau_get_teximage(struct gl_context *ctx, GLenum target, GLint level, - GLenum format, GLenum type, GLvoid *pixels, - struct gl_texture_object *t, - struct gl_texture_image *ti) -{ - nouveau_teximage_map(ctx, ti, GL_MAP_READ_BIT, - 0, 0, ti->Width, ti->Height); - _mesa_get_teximage(ctx, target, level, format, type, pixels, - t, ti); - nouveau_teximage_unmap(ctx, ti); -} - -static void nouveau_bind_texture(struct gl_context *ctx, GLenum target, struct gl_texture_object *t) { @@ -611,7 +610,6 @@ nouveau_set_texbuffer(__DRIcontext *dri_ctx, /* Update the image fields. */ _mesa_init_teximage_fields(ctx, ti, s->width, s->height, 1, 0, s->cpp, s->format); - ti->RowStride = s->pitch / s->cpp; /* Try to validate it. */ if (!validate_teximage(ctx, t, 0, 0, 0, 0, s->width, s->height, 1)) @@ -623,88 +621,14 @@ nouveau_set_texbuffer(__DRIcontext *dri_ctx, _mesa_unlock_texture(ctx, t); } -static void -nouveau_texture_map(struct gl_context *ctx, struct gl_texture_object *t) -{ - int i; - - for (i = t->BaseLevel; i < t->_MaxLevel; i++) { - struct gl_texture_image *ti = t->Image[0][i]; - - if (ti) - nouveau_teximage_map(ctx, ti, GL_MAP_READ_BIT, - 0, 0, ti->Width, ti->Height); - } -} - -static void -nouveau_texture_unmap(struct gl_context *ctx, struct gl_texture_object *t) -{ - int i; - - for (i = t->BaseLevel; i < t->_MaxLevel; i++) { - if (t->Image[0][i]) - nouveau_teximage_unmap(ctx, t->Image[0][i]); - } -} - -static void -store_mipmap(struct gl_context *ctx, GLenum target, int first, int last, - struct gl_texture_object *t) -{ - struct gl_pixelstore_attrib packing = { - .BufferObj = ctx->Shared->NullBufferObj, - .Alignment = 1 - }; - GLenum format = t->Image[0][t->BaseLevel]->TexFormat; - unsigned base_format, type, comps; - int i; - - base_format = _mesa_get_format_base_format(format); - _mesa_format_to_type_and_comps(format, &type, &comps); - - for (i = first; i <= last; i++) { - struct gl_texture_image *ti = t->Image[0][i]; - void *data = ti->Data; - - nouveau_teximage(ctx, 3, target, i, ti->InternalFormat, - ti->Width, ti->Height, ti->Depth, - ti->Border, base_format, type, data, - &packing, t, ti); - - _mesa_free_texmemory(data); - } -} - -static void -nouveau_generate_mipmap(struct gl_context *ctx, GLenum target, - struct gl_texture_object *t) -{ - if (_mesa_meta_check_generate_mipmap_fallback(ctx, target, t)) { - struct gl_texture_image *base = t->Image[0][t->BaseLevel]; - - nouveau_teximage_map(ctx, base, GL_MAP_READ_BIT, - 0, 0, base->Width, base->Height); - _mesa_generate_mipmap(ctx, target, t); - nouveau_teximage_unmap(ctx, base); - - if (!_mesa_is_format_compressed(base->TexFormat)) { - store_mipmap(ctx, target, t->BaseLevel + 1, - get_last_level(t), t); - } - - } else { - _mesa_meta_GenerateMipmap(ctx, target, t); - } -} - void nouveau_texture_functions_init(struct dd_function_table *functions) { functions->NewTextureObject = nouveau_texture_new; functions->DeleteTexture = nouveau_texture_free; functions->NewTextureImage = nouveau_teximage_new; - functions->FreeTexImageData = nouveau_teximage_free; + functions->AllocTextureImageBuffer = nouveau_teximage_buffer_alloc; + functions->FreeTextureImageBuffer = nouveau_teximage_buffer_free; functions->ChooseTextureFormat = nouveau_choose_tex_format; functions->TexImage1D = nouveau_teximage_1d; functions->TexImage2D = nouveau_teximage_2d; @@ -712,9 +636,9 @@ nouveau_texture_functions_init(struct dd_function_table *functions) functions->TexSubImage1D = nouveau_texsubimage_1d; functions->TexSubImage2D = nouveau_texsubimage_2d; functions->TexSubImage3D = nouveau_texsubimage_3d; - functions->GetTexImage = nouveau_get_teximage; + functions->GetTexImage = _mesa_get_teximage; functions->BindTexture = nouveau_bind_texture; - functions->MapTexture = nouveau_texture_map; - functions->UnmapTexture = nouveau_texture_unmap; - functions->GenerateMipmap = nouveau_generate_mipmap; + functions->MapTextureImage = nouveau_teximage_map; + functions->UnmapTextureImage = nouveau_teximage_unmap; + functions->GenerateMipmap = _mesa_meta_GenerateMipmap; } diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.h b/src/mesa/drivers/dri/nouveau/nouveau_texture.h index 56e61c7..5089ed7 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_texture.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.h @@ -28,7 +28,7 @@ #define __NOUVEAU_TEXTURE_H__ struct nouveau_teximage { - struct gl_texture_image base; + struct swrast_texture_image base; struct nouveau_surface surface; struct { struct nouveau_surface surface; -- 1.7.3.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev