diff options
author | Dave Airlie <airlied@redhat.com> | 2009-03-20 10:52:17 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-03-20 10:52:17 +1000 |
commit | 407e8ae5b167b0193e1e5b1266a5d61ed836dfb5 (patch) | |
tree | 2d9d05a5c3122f41a13aa8bd9ae921c1176e6b0d /src/gallium/drivers/i915simple | |
parent | bdaa0341caffc353fd26bbd91865c2d86eed11c1 (diff) | |
parent | 114bb54324f22cb53bcd14607234d0acd74d37bd (diff) |
Merge remote branch 'main/master' into radeon-rewrite
Conflicts:
src/mesa/drivers/dri/r300/r300_cmdbuf.c
src/mesa/drivers/dri/r300/r300_state.c
src/mesa/drivers/dri/r300/r300_swtcl.c
src/mesa/drivers/dri/r300/radeon_ioctl.c
src/mesa/drivers/dri/radeon/radeon_screen.c
Diffstat (limited to 'src/gallium/drivers/i915simple')
-rw-r--r-- | src/gallium/drivers/i915simple/Makefile | 3 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_debug.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_fpc_translate.c | 11 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_prim_vbuf.c | 59 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_screen.c | 83 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_screen.h | 21 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_state_emit.c | 8 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_state_sampler.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_surface.c | 80 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_texture.c | 92 | ||||
-rw-r--r-- | src/gallium/drivers/i915simple/i915_winsys.h | 42 |
11 files changed, 247 insertions, 156 deletions
diff --git a/src/gallium/drivers/i915simple/Makefile b/src/gallium/drivers/i915simple/Makefile index 41a61a0020..12821c5a76 100644 --- a/src/gallium/drivers/i915simple/Makefile +++ b/src/gallium/drivers/i915simple/Makefile @@ -26,6 +26,3 @@ C_SOURCES = \ i915_surface.c include ../../Makefile.template - -symlinks: - diff --git a/src/gallium/drivers/i915simple/i915_debug.c b/src/gallium/drivers/i915simple/i915_debug.c index a300b61c3b..e08582efab 100644 --- a/src/gallium/drivers/i915simple/i915_debug.c +++ b/src/gallium/drivers/i915simple/i915_debug.c @@ -31,7 +31,7 @@ #include "i915_debug.h" #include "i915_batch.h" #include "pipe/internal/p_winsys_screen.h" -#include "pipe/p_debug.h" +#include "util/u_debug.h" static void diff --git a/src/gallium/drivers/i915simple/i915_fpc_translate.c b/src/gallium/drivers/i915simple/i915_fpc_translate.c index d92bdc1bc6..961c1bf213 100644 --- a/src/gallium/drivers/i915simple/i915_fpc_translate.c +++ b/src/gallium/drivers/i915simple/i915_fpc_translate.c @@ -321,16 +321,27 @@ static uint translate_tex_src_target(struct i915_fp_compile *p, uint tex) { switch (tex) { + case TGSI_TEXTURE_SHADOW1D: + /* fall-through */ case TGSI_TEXTURE_1D: return D0_SAMPLE_TYPE_2D; + + case TGSI_TEXTURE_SHADOW2D: + /* fall-through */ case TGSI_TEXTURE_2D: return D0_SAMPLE_TYPE_2D; + + case TGSI_TEXTURE_SHADOWRECT: + /* fall-through */ case TGSI_TEXTURE_RECT: return D0_SAMPLE_TYPE_2D; + case TGSI_TEXTURE_3D: return D0_SAMPLE_TYPE_VOLUME; + case TGSI_TEXTURE_CUBE: return D0_SAMPLE_TYPE_CUBE; + default: i915_program_error(p, "TexSrc type"); return 0; diff --git a/src/gallium/drivers/i915simple/i915_prim_vbuf.c b/src/gallium/drivers/i915simple/i915_prim_vbuf.c index f49f6d6ed1..9bdd91f288 100644 --- a/src/gallium/drivers/i915simple/i915_prim_vbuf.c +++ b/src/gallium/drivers/i915simple/i915_prim_vbuf.c @@ -40,7 +40,7 @@ #include "draw/draw_context.h" #include "draw/draw_vbuf.h" -#include "pipe/p_debug.h" +#include "util/u_debug.h" #include "pipe/p_inlines.h" #include "pipe/internal/p_winsys_screen.h" #include "util/u_math.h" @@ -62,7 +62,7 @@ struct i915_vbuf_render { struct i915_context *i915; /** Vertex size in bytes */ - unsigned vertex_size; + size_t vertex_size; /** Software primitive */ unsigned prim; @@ -79,6 +79,7 @@ struct i915_vbuf_render { size_t vbo_offset; void *vbo_ptr; size_t vbo_alloc_size; + size_t vbo_max_used; }; @@ -108,7 +109,7 @@ i915_vbuf_render_get_vertex_info( struct vbuf_render *render ) } -static void * +static boolean i915_vbuf_render_allocate_vertices( struct vbuf_render *render, ushort vertex_size, ushort nr_vertices ) @@ -124,7 +125,8 @@ i915_vbuf_render_allocate_vertices( struct vbuf_render *render, if (i915_render->vbo_size > size + i915_render->vbo_offset && !i915->vbo_flushed) { } else { i915->vbo_flushed = 0; - pipe_buffer_reference(screen, &i915_render->vbo, NULL); + if (i915_render->vbo) + pipe_buffer_reference(&i915_render->vbo, NULL); } if (!i915_render->vbo) { @@ -134,19 +136,49 @@ i915_vbuf_render_allocate_vertices( struct vbuf_render *render, 64, I915_BUFFER_USAGE_LIT_VERTEX, i915_render->vbo_size); - i915_render->vbo_ptr = pipe_buffer_map(screen, - i915_render->vbo, - PIPE_BUFFER_USAGE_CPU_WRITE); - pipe_buffer_unmap(screen, i915_render->vbo); + } + i915_render->vertex_size = vertex_size; i915->vbo = i915_render->vbo; i915->vbo_offset = i915_render->vbo_offset; i915->dirty |= I915_NEW_VBO; + if (!i915_render->vbo) + return FALSE; + return TRUE; +} + + +static void * +i915_vbuf_render_map_vertices( struct vbuf_render *render ) +{ + struct i915_vbuf_render *i915_render = i915_vbuf_render(render); + struct i915_context *i915 = i915_render->i915; + struct pipe_screen *screen = i915->pipe.screen; + + if (i915->vbo_flushed) + debug_printf("%s bad vbo flush occured stalling on hw\n"); + + i915_render->vbo_ptr = pipe_buffer_map(screen, + i915_render->vbo, + PIPE_BUFFER_USAGE_CPU_WRITE); + return (unsigned char *)i915_render->vbo_ptr + i915->vbo_offset; } +static void +i915_vbuf_render_unmap_vertices( struct vbuf_render *render, + ushort min_index, + ushort max_index ) +{ + struct i915_vbuf_render *i915_render = i915_vbuf_render(render); + struct i915_context *i915 = i915_render->i915; + struct pipe_screen *screen = i915->pipe.screen; + + i915_render->vbo_max_used = MAX2(i915_render->vbo_max_used, i915_render->vertex_size * (max_index + 1)); + pipe_buffer_unmap(screen, i915_render->vbo); +} static boolean i915_vbuf_render_set_primitive( struct vbuf_render *render, @@ -454,18 +486,15 @@ out: static void -i915_vbuf_render_release_vertices( struct vbuf_render *render, - void *vertices, - unsigned vertex_size, - unsigned vertices_used ) +i915_vbuf_render_release_vertices( struct vbuf_render *render ) { struct i915_vbuf_render *i915_render = i915_vbuf_render(render); struct i915_context *i915 = i915_render->i915; - size_t size = (size_t)vertex_size * (size_t)vertices_used; assert(i915->vbo); - i915_render->vbo_offset += size; + i915_render->vbo_offset += i915_render->vbo_max_used; + i915_render->vbo_max_used = 0; i915->vbo = NULL; i915->dirty |= I915_NEW_VBO; } @@ -499,6 +528,8 @@ i915_vbuf_render_create( struct i915_context *i915 ) i915_render->base.get_vertex_info = i915_vbuf_render_get_vertex_info; i915_render->base.allocate_vertices = i915_vbuf_render_allocate_vertices; + i915_render->base.map_vertices = i915_vbuf_render_map_vertices; + i915_render->base.unmap_vertices = i915_vbuf_render_unmap_vertices; i915_render->base.set_primitive = i915_vbuf_render_set_primitive; i915_render->base.draw = i915_vbuf_render_draw; i915_render->base.draw_arrays = i915_vbuf_render_draw_arrays; diff --git a/src/gallium/drivers/i915simple/i915_screen.c b/src/gallium/drivers/i915simple/i915_screen.c index 39e48105b3..f4aa8e60d8 100644 --- a/src/gallium/drivers/i915simple/i915_screen.c +++ b/src/gallium/drivers/i915simple/i915_screen.c @@ -36,6 +36,7 @@ #include "i915_context.h" #include "i915_screen.h" #include "i915_texture.h" +#include "i915_winsys.h" static const char * @@ -204,17 +205,71 @@ i915_destroy_screen( struct pipe_screen *screen ) } +static struct pipe_transfer* +i915_get_tex_transfer(struct pipe_screen *screen, + struct pipe_texture *texture, + unsigned face, unsigned level, unsigned zslice, + enum pipe_transfer_usage usage, unsigned x, unsigned y, + unsigned w, unsigned h) +{ + struct i915_texture *tex = (struct i915_texture *)texture; + struct i915_transfer *trans; + unsigned offset; /* in bytes */ + + if (texture->target == PIPE_TEXTURE_CUBE) { + offset = tex->image_offset[level][face]; + } + else if (texture->target == PIPE_TEXTURE_3D) { + offset = tex->image_offset[level][zslice]; + } + else { + offset = tex->image_offset[level][0]; + assert(face == 0); + assert(zslice == 0); + } + + trans = CALLOC_STRUCT(i915_transfer); + if (trans) { + pipe_texture_reference(&trans->base.texture, texture); + trans->base.format = trans->base.format; + trans->base.width = w; + trans->base.height = h; + trans->base.block = texture->block; + trans->base.nblocksx = texture->nblocksx[level]; + trans->base.nblocksy = texture->nblocksy[level]; + trans->base.stride = tex->stride; + trans->offset = offset; + trans->base.usage = usage; + } + return &trans->base; +} + +static void +i915_tex_transfer_destroy(struct pipe_transfer *trans) +{ + pipe_texture_reference(&trans->texture, NULL); + FREE(trans); +} + static void * -i915_surface_map( struct pipe_screen *screen, - struct pipe_surface *surface, - unsigned flags ) +i915_transfer_map( struct pipe_screen *screen, + struct pipe_transfer *transfer ) { - struct i915_texture *tex = (struct i915_texture *)surface->texture; - char *map = pipe_buffer_map( screen, tex->buffer, flags ); + struct i915_texture *tex = (struct i915_texture *)transfer->texture; + char *map; + unsigned flags = 0; + + if (transfer->usage != PIPE_TRANSFER_WRITE) + flags |= PIPE_BUFFER_USAGE_CPU_READ; + + if (transfer->usage != PIPE_TRANSFER_READ) + flags |= PIPE_BUFFER_USAGE_CPU_WRITE; + + map = pipe_buffer_map( screen, tex->buffer, flags ); if (map == NULL) return NULL; - if (surface->texture && + if (transfer->texture && (flags & PIPE_BUFFER_USAGE_CPU_WRITE)) { /* Do something to notify contexts of a texture change. @@ -222,14 +277,16 @@ i915_surface_map( struct pipe_screen *screen, /* i915_screen(screen)->timestamp++; */ } - return map + surface->offset; + return map + i915_transfer(transfer)->offset + + transfer->y / transfer->block.height * transfer->stride + + transfer->x / transfer->block.width * transfer->block.size; } static void -i915_surface_unmap(struct pipe_screen *screen, - struct pipe_surface *surface) +i915_transfer_unmap(struct pipe_screen *screen, + struct pipe_transfer *transfer) { - struct i915_texture *tex = (struct i915_texture *)surface->texture; + struct i915_texture *tex = (struct i915_texture *)transfer->texture; pipe_buffer_unmap( screen, tex->buffer ); } @@ -278,8 +335,10 @@ i915_create_screen(struct pipe_winsys *winsys, uint pci_id) i915screen->screen.get_param = i915_get_param; i915screen->screen.get_paramf = i915_get_paramf; i915screen->screen.is_format_supported = i915_is_format_supported; - i915screen->screen.surface_map = i915_surface_map; - i915screen->screen.surface_unmap = i915_surface_unmap; + i915screen->screen.get_tex_transfer = i915_get_tex_transfer; + i915screen->screen.tex_transfer_destroy = i915_tex_transfer_destroy; + i915screen->screen.transfer_map = i915_transfer_map; + i915screen->screen.transfer_unmap = i915_transfer_unmap; i915_init_screen_texture_functions(&i915screen->screen); u_simple_screen_init(&i915screen->screen); diff --git a/src/gallium/drivers/i915simple/i915_screen.h b/src/gallium/drivers/i915simple/i915_screen.h index 73b0ff05ce..5284c32595 100644 --- a/src/gallium/drivers/i915simple/i915_screen.h +++ b/src/gallium/drivers/i915simple/i915_screen.h @@ -50,16 +50,29 @@ struct i915_screen }; -/** cast wrapper */ +/** + * Subclass of pipe_transfer + */ +struct i915_transfer +{ + struct pipe_transfer base; + + unsigned offset; +}; + + +/** cast wrappers */ static INLINE struct i915_screen * i915_screen(struct pipe_screen *pscreen) { return (struct i915_screen *) pscreen; } - -extern struct pipe_screen * -i915_create_screen(struct pipe_winsys *winsys, uint pci_id); +static INLINE struct i915_transfer * +i915_transfer( struct pipe_transfer *transfer ) +{ + return (struct i915_transfer *)transfer; +} #ifdef __cplusplus diff --git a/src/gallium/drivers/i915simple/i915_state_emit.c b/src/gallium/drivers/i915simple/i915_state_emit.c index 6558cf1c3e..1e1fb968b4 100644 --- a/src/gallium/drivers/i915simple/i915_state_emit.c +++ b/src/gallium/drivers/i915simple/i915_state_emit.c @@ -211,11 +211,9 @@ i915_emit_hardware_state(struct i915_context *i915 ) struct pipe_surface *depth_surface = i915->framebuffer.zsbuf; if (cbuf_surface) { - unsigned cpitch = cbuf_surface->stride; unsigned ctile = BUF_3D_USE_FENCE; struct i915_texture *tex = (struct i915_texture *) cbuf_surface->texture; - struct pipe_buffer *buffer = tex->buffer; assert(tex); if (tex && tex->tiled) { @@ -225,7 +223,7 @@ i915_emit_hardware_state(struct i915_context *i915 ) OUT_BATCH(_3DSTATE_BUF_INFO_CMD); OUT_BATCH(BUF_3D_ID_COLOR_BACK | - BUF_3D_PITCH(cpitch) | /* pitch in bytes */ + BUF_3D_PITCH(tex->stride) | /* pitch in bytes */ ctile); OUT_RELOC(tex->buffer, @@ -236,11 +234,9 @@ i915_emit_hardware_state(struct i915_context *i915 ) /* What happens if no zbuf?? */ if (depth_surface) { - unsigned zpitch = depth_surface->stride; unsigned ztile = BUF_3D_USE_FENCE; struct i915_texture *tex = (struct i915_texture *) depth_surface->texture; - struct pipe_buffer *buffer = tex->buffer; assert(tex); if (tex && tex->tiled) { @@ -250,7 +246,7 @@ i915_emit_hardware_state(struct i915_context *i915 ) OUT_BATCH(_3DSTATE_BUF_INFO_CMD); OUT_BATCH(BUF_3D_ID_DEPTH | - BUF_3D_PITCH(zpitch) | /* pitch in bytes */ + BUF_3D_PITCH(tex->stride) | /* pitch in bytes */ ztile); OUT_RELOC(tex->buffer, diff --git a/src/gallium/drivers/i915simple/i915_state_sampler.c b/src/gallium/drivers/i915simple/i915_state_sampler.c index c09c10601b..3667ed1afa 100644 --- a/src/gallium/drivers/i915simple/i915_state_sampler.c +++ b/src/gallium/drivers/i915simple/i915_state_sampler.c @@ -116,7 +116,7 @@ static void update_sampler(struct i915_context *i915, ws == PIPE_TEX_WRAP_CLAMP_TO_BORDER || wt == PIPE_TEX_WRAP_CLAMP_TO_BORDER || wr == PIPE_TEX_WRAP_CLAMP_TO_BORDER)) { - if (i915->strict_conformance) { + if (i915->conformance_mode > 0) { assert(0); /* sampler->fallback = true; */ /* TODO */ diff --git a/src/gallium/drivers/i915simple/i915_surface.c b/src/gallium/drivers/i915simple/i915_surface.c index 94e2deaf61..09b2c499b8 100644 --- a/src/gallium/drivers/i915simple/i915_surface.c +++ b/src/gallium/drivers/i915simple/i915_surface.c @@ -41,50 +41,27 @@ */ static void i915_surface_copy(struct pipe_context *pipe, - boolean do_flip, struct pipe_surface *dst, unsigned dstx, unsigned dsty, struct pipe_surface *src, unsigned srcx, unsigned srcy, unsigned width, unsigned height) { - assert( dst != src ); - assert( dst->block.size == src->block.size ); - assert( dst->block.width == src->block.height ); - assert( dst->block.height == src->block.height ); + struct i915_texture *dst_tex = (struct i915_texture *)dst->texture; + struct i915_texture *src_tex = (struct i915_texture *)src->texture; - if (0) { - void *dst_map = pipe->screen->surface_map( pipe->screen, - dst, - PIPE_BUFFER_USAGE_CPU_WRITE ); - - const void *src_map = pipe->screen->surface_map( pipe->screen, - src, - PIPE_BUFFER_USAGE_CPU_READ ); - - pipe_copy_rect(dst_map, - &dst->block, - dst->stride, - dstx, dsty, - width, height, - src_map, - do_flip ? -(int) src->stride : src->stride, - srcx, do_flip ? height - 1 - srcy : srcy); + assert( dst != src ); + assert( dst_tex->base.block.size == src_tex->base.block.size ); + assert( dst_tex->base.block.width == src_tex->base.block.height ); + assert( dst_tex->base.block.height == src_tex->base.block.height ); + assert( dst_tex->base.block.width == 1 ); + assert( dst_tex->base.block.height == 1 ); - pipe->screen->surface_unmap(pipe->screen, src); - pipe->screen->surface_unmap(pipe->screen, dst); - } - else { - struct i915_texture *dst_tex = (struct i915_texture *)dst->texture; - struct i915_texture *src_tex = (struct i915_texture *)src->texture; - assert(dst->block.width == 1); - assert(dst->block.height == 1); - i915_copy_blit( i915_context(pipe), - do_flip, - dst->block.size, - (unsigned short) src->stride, src_tex->buffer, src->offset, - (unsigned short) dst->stride, dst_tex->buffer, dst->offset, - (short) srcx, (short) srcy, (short) dstx, (short) dsty, (short) width, (short) height ); - } + i915_copy_blit( i915_context(pipe), + FALSE, + dst_tex->base.block.size, + (unsigned short) src_tex->stride, src_tex->buffer, src->offset, + (unsigned short) dst_tex->stride, dst_tex->buffer, dst->offset, + (short) srcx, (short) srcy, (short) dstx, (short) dsty, (short) width, (short) height ); } @@ -94,27 +71,18 @@ i915_surface_fill(struct pipe_context *pipe, unsigned dstx, unsigned dsty, unsigned width, unsigned height, unsigned value) { - if (0) { - void *dst_map = pipe->screen->surface_map( pipe->screen, - dst, - PIPE_BUFFER_USAGE_CPU_WRITE ); + struct i915_texture *tex = (struct i915_texture *)dst->texture; - pipe_fill_rect(dst_map, &dst->block, dst->stride, dstx, dsty, width, height, value); + assert(tex->base.block.width == 1); + assert(tex->base.block.height == 1); - pipe->screen->surface_unmap(pipe->screen, dst); - } - else { - struct i915_texture *tex = (struct i915_texture *)dst->texture; - assert(dst->block.width == 1); - assert(dst->block.height == 1); - i915_fill_blit( i915_context(pipe), - dst->block.size, - (unsigned short) dst->stride, - tex->buffer, dst->offset, - (short) dstx, (short) dsty, - (short) width, (short) height, - value ); - } + i915_fill_blit( i915_context(pipe), + tex->base.block.size, + (unsigned short) tex->stride, + tex->buffer, dst->offset, + (short) dstx, (short) dsty, + (short) width, (short) height, + value ); } diff --git a/src/gallium/drivers/i915simple/i915_texture.c b/src/gallium/drivers/i915simple/i915_texture.c index b2ca3a2286..39aca9f817 100644 --- a/src/gallium/drivers/i915simple/i915_texture.c +++ b/src/gallium/drivers/i915simple/i915_texture.c @@ -42,6 +42,7 @@ #include "i915_texture.h" #include "i915_debug.h" #include "i915_screen.h" +#include "i915_winsys.h" /* * Helper function and arrays @@ -581,7 +582,6 @@ i915_texture_create(struct pipe_screen *screen, const struct pipe_texture *templat) { struct i915_screen *i915screen = i915_screen(screen); - struct pipe_winsys *ws = screen->winsys; struct i915_texture *tex = CALLOC_STRUCT(i915_texture); size_t tex_size; @@ -589,7 +589,7 @@ i915_texture_create(struct pipe_screen *screen, return NULL; tex->base = *templat; - tex->base.refcount = 1; + pipe_reference_init(&tex->base.reference, 1); tex->base.screen = screen; tex->base.nblocksx[0] = pf_get_nblocksx(&tex->base.block, tex->base.width[0]); @@ -605,7 +605,7 @@ i915_texture_create(struct pipe_screen *screen, tex_size = tex->stride * tex->total_nblocksy; - tex->buffer = ws->buffer_create(ws, 64, + tex->buffer = screen->buffer_create(screen, 64, PIPE_BUFFER_USAGE_PIXEL, tex_size); @@ -628,33 +628,22 @@ fail: static void -i915_texture_release(struct pipe_screen *screen, - struct pipe_texture **pt) +i915_texture_destroy(struct pipe_texture *pt) { - if (!*pt) - return; + struct i915_texture *tex = (struct i915_texture *)pt; + uint i; /* - DBG("%s %p refcount will be %d\n", - __FUNCTION__, (void *) *pt, (*pt)->refcount - 1); + DBG("%s deleting %p\n", __FUNCTION__, (void *) tex); */ - if (--(*pt)->refcount <= 0) { - struct i915_texture *tex = (struct i915_texture *)*pt; - uint i; - - /* - DBG("%s deleting %p\n", __FUNCTION__, (void *) tex); - */ - pipe_buffer_reference(screen, &tex->buffer, NULL); + pipe_buffer_reference(&tex->buffer, NULL); - for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++) - if (tex->image_offset[i]) - FREE(tex->image_offset[i]); + for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++) + if (tex->image_offset[i]) + FREE(tex->image_offset[i]); - FREE(tex); - } - *pt = NULL; + FREE(tex); } static struct pipe_surface * @@ -681,15 +670,11 @@ i915_get_tex_surface(struct pipe_screen *screen, ps = CALLOC_STRUCT(pipe_surface); if (ps) { - ps->refcount = 1; + pipe_reference_init(&ps->reference, 1); pipe_texture_reference(&ps->texture, pt); ps->format = pt->format; ps->width = pt->width[level]; ps->height = pt->height[level]; - ps->block = pt->block; - ps->nblocksx = pt->nblocksx[level]; - ps->nblocksy = pt->nblocksy[level]; - ps->stride = tex->stride; ps->offset = offset; ps->usage = flags; ps->status = PIPE_SURFACE_STATUS_DEFINED; @@ -718,7 +703,7 @@ i915_texture_blanket(struct pipe_screen * screen, return NULL; tex->base = *base; - tex->base.refcount = 1; + pipe_reference_init(&tex->base.reference, 1); tex->base.screen = screen; tex->stride = stride[0]; @@ -726,7 +711,7 @@ i915_texture_blanket(struct pipe_screen * screen, i915_miptree_set_level_info(tex, 0, 1, base->width[0], base->height[0], 1); i915_miptree_set_image_offset(tex, 0, 0, 0, 0); - pipe_buffer_reference(screen, &tex->buffer, buffer); + pipe_buffer_reference(&tex->buffer, buffer); return &tex->base; } @@ -738,34 +723,43 @@ i915_init_texture_functions(struct i915_context *i915) } static void -i915_tex_surface_release(struct pipe_screen *screen, - struct pipe_surface **surface) +i915_tex_surface_destroy(struct pipe_surface *surf) { - struct pipe_surface *surf = *surface; - - if (--surf->refcount == 0) { - - /* This really should not be possible, but it's actually - * happening quite a bit... Will fix. - */ - if (surf->status == PIPE_SURFACE_STATUS_CLEAR) { - debug_printf("XXX destroying a surface with pending clears...\n"); - assert(0); - } - - pipe_texture_reference(&surf->texture, NULL); - FREE(surf); + /* This really should not be possible, but it's actually + * happening quite a bit... Will fix. + */ + if (surf->status == PIPE_SURFACE_STATUS_CLEAR) { + debug_printf("XXX destroying a surface with pending clears...\n"); + assert(0); } - *surface = NULL; + pipe_texture_reference(&surf->texture, NULL); + FREE(surf); } void i915_init_screen_texture_functions(struct pipe_screen *screen) { screen->texture_create = i915_texture_create; - screen->texture_release = i915_texture_release; + screen->texture_destroy = i915_texture_destroy; screen->get_tex_surface = i915_get_tex_surface; screen->texture_blanket = i915_texture_blanket; - screen->tex_surface_release = i915_tex_surface_release; + screen->tex_surface_destroy = i915_tex_surface_destroy; +} + +boolean i915_get_texture_buffer( struct pipe_texture *texture, + struct pipe_buffer **buf, + unsigned *stride ) +{ + struct i915_texture *tex = (struct i915_texture *)texture; + + if (!tex) + return FALSE; + + pipe_buffer_reference(buf, tex->buffer); + + if (stride) + *stride = tex->stride; + + return TRUE; } diff --git a/src/gallium/drivers/i915simple/i915_winsys.h b/src/gallium/drivers/i915simple/i915_winsys.h index 81904c2a74..ff5b34f193 100644 --- a/src/gallium/drivers/i915simple/i915_winsys.h +++ b/src/gallium/drivers/i915simple/i915_winsys.h @@ -30,7 +30,8 @@ * This is the interface that i915simple requires any window system * hosting it to implement. This is the only include file in i915simple * which is public. - * + * + * This isn't currently true as the winsys needs i915_batchbuffer.h */ #ifndef I915_WINSYS_H @@ -45,10 +46,9 @@ extern "C" { #endif -/* Pipe drivers are (meant to be!) independent of both GL and the - * window system. The window system provides a buffer manager and a - * set of additional hooks for things like command buffer submission, - * etc. +/* Pipe drivers are independent of both GL and the window system. + * The window system provides a buffer manager and a set of additional + * hooks for things like command buffer submission, etc. * * There clearly has to be some agreement between the window system * driver and the hardware driver about the format of command buffers, @@ -56,6 +56,7 @@ extern "C" { */ struct i915_batchbuffer; +struct pipe_texture; struct pipe_buffer; struct pipe_fence_handle; struct pipe_winsys; @@ -64,7 +65,7 @@ struct pipe_screen; /** * Additional winsys interface for i915simple. - * + * * It is an over-simple batchbuffer mechanism. Will want to improve the * performance of this, perhaps based on the cmdstream stuff. It * would be pretty impossible to implement swz on top of this @@ -110,12 +111,33 @@ struct i915_winsys { #define I915_BUFFER_USAGE_LIT_VERTEX (PIPE_BUFFER_USAGE_CUSTOM << 0) -struct pipe_context *i915_create_context( struct pipe_screen *, - struct pipe_winsys *, - struct i915_winsys * ); +/** + * Create i915 pipe_screen. + */ +struct pipe_screen *i915_create_screen( struct pipe_winsys *winsys, + uint pci_id ); + +/** + * Create a i915 pipe_context. + */ +struct pipe_context *i915_create_context( struct pipe_screen *screen, + struct pipe_winsys *winsys, + struct i915_winsys *i915 ); + +/** + * Used for the winsys to get the buffer used for a texture + * and also the stride used for the texture. + * + * Buffer is referenced for you so you need to unref after use. + * + * This is needed for example kms. + */ +boolean i915_get_texture_buffer( struct pipe_texture *texture, + struct pipe_buffer **buf, + unsigned *stride ); #ifdef __cplusplus } #endif -#endif +#endif |