struct pipe_context *brw_create_context(struct pipe_screen *screen, void *priv) { struct brw_context *brw = (struct brw_context *) CALLOC_STRUCT(brw_context); if (!brw) { debug_printf("%s: failed to alloc context\n", __FUNCTION__); return NULL; } brw->base.screen = screen; brw->base.priv = priv; brw->base.destroy = brw_destroy_context; brw->sws = brw_screen(screen)->sws; brw->chipset = brw_screen(screen)->chipset; brw_pipe_blend_init( brw ); brw_pipe_depth_stencil_init( brw ); brw_pipe_framebuffer_init( brw ); brw_pipe_flush_init( brw ); brw_pipe_misc_init( brw ); brw_pipe_query_init( brw ); brw_pipe_rast_init( brw ); brw_pipe_sampler_init( brw ); brw_pipe_shader_init( brw ); brw_pipe_vertex_init( brw ); brw_pipe_clear_init( brw ); brw_hw_cc_init( brw ); brw_init_state( brw ); brw_draw_init( brw ); brw->state.dirty.mesa = ~0; brw->state.dirty.brw = ~0; brw->flags.always_emit_state = 0; make_empty_list(&brw->query.active_head); brw->batch = brw_batchbuffer_alloc( brw->sws, brw->chipset ); if (brw->batch == NULL) goto fail; return &brw->base; fail: if (brw->batch) brw_batchbuffer_free( brw->batch ); return NULL; }
static void * brw_texture_transfer_map(struct pipe_context *pipe, struct pipe_transfer *transfer) { struct pipe_resource *resource = transfer->resource; struct brw_texture *tex = brw_texture(transfer->resource); struct brw_winsys_screen *sws = brw_screen(pipe->screen)->sws; struct pipe_box *box = &transfer->box; enum pipe_format format = resource->format; unsigned usage = transfer->usage; unsigned offset; char *map; if (resource->target != PIPE_TEXTURE_3D && resource->target != PIPE_TEXTURE_CUBE) assert(box->z == 0); offset = tex->image_offset[transfer->level][box->z]; map = sws->bo_map(tex->bo, BRW_DATA_OTHER, 0, tex->bo->size, (usage & PIPE_TRANSFER_WRITE) ? TRUE : FALSE, (usage & 0) ? TRUE : FALSE, (usage & 0) ? TRUE : FALSE); if (!map) return NULL; return map + offset + box->y / util_format_get_blockheight(format) * transfer->stride + box->x / util_format_get_blockwidth(format) * util_format_get_blocksize(format); }
static void brw_texture_transfer_unmap(struct pipe_context *pipe, struct pipe_transfer *transfer) { struct brw_texture *tex = brw_texture(transfer->resource); struct brw_winsys_screen *sws = brw_screen(pipe->screen)->sws; sws->bo_unmap(tex->bo); }
static const char * brw_get_name(struct pipe_screen *screen) { static char buffer[128]; const char *chipset; switch (brw_screen(screen)->chipset.pci_id) { case PCI_CHIP_I965_G: chipset = "I965_G"; break; case PCI_CHIP_I965_Q: chipset = "I965_Q"; break; case PCI_CHIP_I965_G_1: chipset = "I965_G_1"; break; case PCI_CHIP_I946_GZ: chipset = "I946_GZ"; break; case PCI_CHIP_I965_GM: chipset = "I965_GM"; break; case PCI_CHIP_I965_GME: chipset = "I965_GME"; break; case PCI_CHIP_GM45_GM: chipset = "GM45_GM"; break; case PCI_CHIP_IGD_E_G: chipset = "IGD_E_G"; break; case PCI_CHIP_Q45_G: chipset = "Q45_G"; break; case PCI_CHIP_G45_G: chipset = "G45_G"; break; case PCI_CHIP_G41_G: chipset = "G41_G"; break; case PCI_CHIP_B43_G: chipset = "B43_G"; break; case PCI_CHIP_ILD_G: chipset = "ILD_G"; break; case PCI_CHIP_ILM_G: chipset = "ILM_G"; break; default: chipset = "unknown"; break; } util_snprintf(buffer, sizeof(buffer), "i965 (chipset: %s)", chipset); return buffer; }
static void brw_destroy_screen(struct pipe_screen *screen) { struct brw_screen *bscreen = brw_screen(screen); if (bscreen->sws) bscreen->sws->destroy(bscreen->sws); FREE(bscreen); }
static boolean brw_texture_get_handle(struct pipe_screen *screen, struct pipe_resource *texture, struct winsys_handle *whandle) { struct brw_screen *bscreen = brw_screen(screen); struct brw_texture *tex = brw_texture(texture); unsigned stride; stride = tex->pitch * tex->cpp; return bscreen->sws->bo_get_handle(tex->bo, whandle, stride) == PIPE_OK; }
u_default_transfer_destroy, /* transfer_destroy */ brw_texture_transfer_map, /* transfer_map */ u_default_transfer_flush_region, /* transfer_flush_region */ brw_texture_transfer_unmap, /* transfer_unmap */ u_default_transfer_inline_write /* transfer_inline_write */ }; struct pipe_resource * brw_texture_create( struct pipe_screen *screen, const struct pipe_resource *template ) { struct brw_screen *bscreen = brw_screen(screen); struct brw_texture *tex; enum brw_buffer_type buffer_type; enum pipe_error ret; GLuint format; tex = CALLOC_STRUCT(brw_texture); if (tex == NULL) return NULL; tex->b.b = *template; tex->b.vtbl = &brw_texture_vtbl; pipe_reference_init(&tex->b.b.reference, 1); tex->b.b.screen = screen; /* XXX: compressed textures need special treatment here