static dri_bo * brw_create_texture_surface( struct brw_context *brw, struct brw_surface_key *key ) { struct brw_surface_state surf; dri_bo *bo; memset(&surf, 0, sizeof(surf)); surf.ss0.mipmap_layout_mode = BRW_SURFACE_MIPMAPLAYOUT_BELOW; surf.ss0.surface_type = translate_tex_target(key->target); surf.ss0.surface_format = translate_tex_format(key->format, key->internal_format, key->depthmode); /* This is ok for all textures with channel width 8bit or less: */ /* surf.ss0.data_return_format = BRW_SURFACERETURNFORMAT_S1; */ surf.ss1.base_addr = key->bo->offset; /* reloc */ surf.ss2.mip_count = key->last_level - key->first_level; surf.ss2.width = key->width - 1; surf.ss2.height = key->height - 1; brw_set_surface_tiling(&surf, key->tiling); surf.ss3.pitch = (key->pitch * key->cpp) - 1; surf.ss3.depth = key->depth - 1; surf.ss4.min_lod = 0; if (key->target == GL_TEXTURE_CUBE_MAP) { surf.ss0.cube_pos_x = 1; surf.ss0.cube_pos_y = 1; surf.ss0.cube_pos_z = 1; surf.ss0.cube_neg_x = 1; surf.ss0.cube_neg_y = 1; surf.ss0.cube_neg_z = 1; } bo = brw_upload_cache(&brw->surface_cache, BRW_SS_SURFACE, key, sizeof(*key), &key->bo, 1, &surf, sizeof(surf)); /* Emit relocation to surface contents */ drm_intel_bo_emit_reloc(bo, offsetof(struct brw_surface_state, ss1), key->bo, 0, I915_GEM_DOMAIN_SAMPLER, 0); return bo; }
static void brw_update_texture_surface( GLcontext *ctx, GLuint unit, struct brw_surface_state *surf ) { struct intel_context *intel = intel_context(ctx); struct brw_context *brw = brw_context(ctx); struct gl_texture_object *tObj = brw->attribs.Texture->Unit[unit]._Current; struct intel_texture_object *intelObj = intel_texture_object(tObj); struct gl_texture_image *firstImage = tObj->Image[0][intelObj->firstLevel]; memset(surf, 0, sizeof(*surf)); surf->ss0.mipmap_layout_mode = BRW_SURFACE_MIPMAPLAYOUT_BELOW; surf->ss0.surface_type = translate_tex_target(tObj->Target); surf->ss0.surface_format = translate_tex_format(firstImage->TexFormat->MesaFormat, tObj->DepthMode); /* This is ok for all textures with channel width 8bit or less: */ /* surf->ss0.data_return_format = BRW_SURFACERETURNFORMAT_S1; */ /* BRW_NEW_LOCK */ surf->ss1.base_addr = bmBufferOffset(intel, intelObj->mt->region->buffer); surf->ss2.mip_count = intelObj->lastLevel - intelObj->firstLevel; surf->ss2.width = firstImage->Width - 1; surf->ss2.height = firstImage->Height - 1; surf->ss3.tile_walk = BRW_TILEWALK_XMAJOR; surf->ss3.tiled_surface = intelObj->mt->region->tiled; /* always zero */ surf->ss3.pitch = (intelObj->mt->pitch * intelObj->mt->cpp) - 1; surf->ss3.depth = firstImage->Depth - 1; surf->ss4.min_lod = 0; if (tObj->Target == GL_TEXTURE_CUBE_MAP) { surf->ss0.cube_pos_x = 1; surf->ss0.cube_pos_y = 1; surf->ss0.cube_pos_z = 1; surf->ss0.cube_neg_x = 1; surf->ss0.cube_neg_y = 1; surf->ss0.cube_neg_z = 1; } }