Преглед изворни кода

nouveau: Add implementation of MapRenderbuffer.

Perhaps the easiest implementation, nouveau can directly map buffers
even if tiled, and uses separate surfaces for its texture
renderbuffers so we don't have to worry about that offset.

Reviewed-by: Brian Paul <brianp@vmware.com>
tags/mesa-8.0-rc1
Eric Anholt пре 14 година
родитељ
комит
4b8f4e7ce1
1 измењених фајлова са 46 додато и 0 уклоњено
  1. 46
    0
      src/mesa/drivers/dri/nouveau/nouveau_fbo.c

+ 46
- 0
src/mesa/drivers/dri/nouveau/nouveau_fbo.c Прегледај датотеку

@@ -133,6 +133,50 @@ nouveau_renderbuffer_new(struct gl_context *ctx, GLuint name)
return rb;
}

static void
nouveau_renderbuffer_map(struct gl_context *ctx,
struct gl_renderbuffer *rb,
GLuint x, GLuint y, GLuint w, GLuint h,
GLbitfield mode,
GLubyte **out_map,
GLint *out_stride)
{
struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface;
GLubyte *map;
int stride;
int flags = 0;

if (mode & GL_MAP_READ_BIT)
flags |= NOUVEAU_BO_RD;
if (mode & GL_MAP_WRITE_BIT)
flags |= NOUVEAU_BO_WR;

nouveau_bo_map(s->bo, flags);

map = s->bo->map;
stride = s->pitch;

if (rb->Name == 0) {
map += stride * (rb->Height - 1);
stride = -stride;
}

map += x * s->cpp;
map += (int)y * stride;

*out_map = map;
*out_stride = stride;
}

static void
nouveau_renderbuffer_unmap(struct gl_context *ctx,
struct gl_renderbuffer *rb)
{
struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface;

nouveau_bo_unmap(s->bo);
}

static GLboolean
nouveau_renderbuffer_dri_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
GLenum internalFormat,
@@ -268,6 +312,8 @@ nouveau_fbo_functions_init(struct dd_function_table *functions)
#if FEATURE_EXT_framebuffer_object
functions->NewFramebuffer = nouveau_framebuffer_new;
functions->NewRenderbuffer = nouveau_renderbuffer_new;
functions->MapRenderbuffer = nouveau_renderbuffer_map;
functions->UnmapRenderbuffer = nouveau_renderbuffer_unmap;
functions->BindFramebuffer = nouveau_bind_framebuffer;
functions->FramebufferRenderbuffer = nouveau_framebuffer_renderbuffer;
functions->RenderTexture = nouveau_render_texture;

Loading…
Откажи
Сачувај