예제 #1
0
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;
}
예제 #2
0
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);
}
예제 #3
0
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);
}
예제 #4
0
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;
}
예제 #5
0
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);
}
예제 #6
0
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;
}
예제 #7
0
   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