static struct pipe_sampler_view *etna_pipe_create_sampler_view(struct pipe_context *pipe, struct pipe_resource *texture, const struct pipe_sampler_view *templat) { struct etna_pipe_context *priv = etna_pipe_context(pipe); struct etna_sampler_view *sv = CALLOC_STRUCT(etna_sampler_view); sv->base = *templat; sv->base.context = pipe; sv->base.texture = 0; pipe_resource_reference(&sv->base.texture, texture); sv->base.texture = texture; assert(sv->base.texture); struct compiled_sampler_view *cs = CALLOC_STRUCT(compiled_sampler_view); struct etna_resource *res = etna_resource(sv->base.texture); assert(res != NULL); cs->TE_SAMPLER_CONFIG0 = VIVS_TE_SAMPLER_CONFIG0_TYPE(translate_texture_target(res->base.target, false)) | VIVS_TE_SAMPLER_CONFIG0_FORMAT(translate_texture_format(sv->base.format, false)); /* merged with sampler state */ cs->TE_SAMPLER_CONFIG0_MASK = 0xffffffff; cs->TE_SAMPLER_CONFIG1 = VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_R(templat->swizzle_r) | VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_G(templat->swizzle_g) | VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_B(templat->swizzle_b) | VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_A(templat->swizzle_a) | VIVS_TE_SAMPLER_CONFIG1_HALIGN(res->halign); cs->TE_SAMPLER_SIZE = VIVS_TE_SAMPLER_SIZE_WIDTH(res->base.width0)| VIVS_TE_SAMPLER_SIZE_HEIGHT(res->base.height0); cs->TE_SAMPLER_LOG_SIZE = VIVS_TE_SAMPLER_LOG_SIZE_WIDTH(etna_log2_fixp55(res->base.width0)) | VIVS_TE_SAMPLER_LOG_SIZE_HEIGHT(etna_log2_fixp55(res->base.height0)); /* Set up levels-of-detail */ for(int lod=0; lod<=res->base.last_level; ++lod) { cs->TE_SAMPLER_LOD_ADDR[lod] = etna_bo_gpu_address(res->bo) + res->levels[lod].offset; } cs->min_lod = sv->base.u.tex.first_level << 5; cs->max_lod = MIN2(sv->base.u.tex.last_level, res->base.last_level) << 5; /* Workaround for npot textures -- it appears that only CLAMP_TO_EDGE is supported when the * appropriate capability is not set. */ if(!priv->specs.npot_tex_any_wrap && (!util_is_power_of_two(res->base.width0) || !util_is_power_of_two(res->base.height0))) { cs->TE_SAMPLER_CONFIG0_MASK = ~(VIVS_TE_SAMPLER_CONFIG0_UWRAP__MASK | VIVS_TE_SAMPLER_CONFIG0_VWRAP__MASK); cs->TE_SAMPLER_CONFIG0 |= VIVS_TE_SAMPLER_CONFIG0_UWRAP(TEXTURE_WRAPMODE_CLAMP_TO_EDGE) | VIVS_TE_SAMPLER_CONFIG0_VWRAP(TEXTURE_WRAPMODE_CLAMP_TO_EDGE); } sv->internal = cs; pipe_reference_init(&sv->base.reference, 1); return &sv->base; }
static struct pipe_sampler_view *etna_pipe_create_sampler_view(struct pipe_context *pipe, struct pipe_resource *texture, const struct pipe_sampler_view *templat) { //struct etna_pipe_context *priv = etna_pipe_context(pipe); struct etna_sampler_view *sv = CALLOC_STRUCT(etna_sampler_view); sv->base = *templat; sv->base.context = pipe; sv->base.texture = 0; pipe_resource_reference(&sv->base.texture, texture); sv->base.texture = texture; assert(sv->base.texture); struct compiled_sampler_view *cs = CALLOC_STRUCT(compiled_sampler_view); struct etna_resource *res = etna_resource(sv->base.texture); assert(res != NULL); cs->TE_SAMPLER_CONFIG0 = VIVS_TE_SAMPLER_CONFIG0_TYPE(translate_texture_target(res->base.target, false)) | VIVS_TE_SAMPLER_CONFIG0_FORMAT(translate_texture_format(sv->base.format, false)); /* merged with sampler state */ cs->TE_SAMPLER_CONFIG1 = VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_R(templat->swizzle_r) | VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_G(templat->swizzle_g) | VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_B(templat->swizzle_b) | VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_A(templat->swizzle_a) | VIVS_TE_SAMPLER_CONFIG1_HALIGN(res->halign); cs->TE_SAMPLER_SIZE = VIVS_TE_SAMPLER_SIZE_WIDTH(res->base.width0)| VIVS_TE_SAMPLER_SIZE_HEIGHT(res->base.height0); cs->TE_SAMPLER_LOG_SIZE = VIVS_TE_SAMPLER_LOG_SIZE_WIDTH(log2_fixp55(res->base.width0)) | VIVS_TE_SAMPLER_LOG_SIZE_HEIGHT(log2_fixp55(res->base.height0)); /* XXX in principle we only have to define lods sv->first_level .. sv->last_level */ for(int lod=0; lod<=res->base.last_level; ++lod) { cs->TE_SAMPLER_LOD_ADDR[lod] = res->levels[lod].address; } cs->min_lod = sv->base.u.tex.first_level << 5; cs->max_lod = MIN2(sv->base.u.tex.last_level, res->base.last_level) << 5; sv->internal = cs; pipe_reference_init(&sv->base.reference, 1); return &sv->base; }