Пример #1
0
static struct pipe_sampler_view *
st_get_texture_sampler_view_from_stobj(struct st_context *st,
                                       struct st_texture_object *stObj,
                                       enum pipe_format format,
                                       unsigned glsl_version)
{
    struct pipe_sampler_view **sv;
    const struct st_texture_image *firstImage;
    if (!stObj || !stObj->pt) {
        return NULL;
    }

    sv = st_texture_get_sampler_view(st, stObj);

    if (util_format_is_depth_and_stencil(format)) {
        if (stObj->base.StencilSampling)
            format = util_format_stencil_only(format);
        else {
            firstImage = st_texture_image_const(_mesa_base_tex_image(&stObj->base));
            if (firstImage->base._BaseFormat == GL_STENCIL_INDEX)
                format = util_format_stencil_only(format);
        }
    }

    /* if sampler view has changed dereference it */
    if (*sv) {
        if (check_sampler_swizzle(stObj, *sv, glsl_version) ||
                (format != (*sv)->format) ||
                gl_target_to_pipe(stObj->base.Target) != (*sv)->target ||
                stObj->base.MinLevel + stObj->base.BaseLevel != (*sv)->u.tex.first_level ||
                last_level(stObj) != (*sv)->u.tex.last_level ||
                stObj->base.MinLayer != (*sv)->u.tex.first_layer ||
                last_layer(stObj) != (*sv)->u.tex.last_layer) {
            pipe_sampler_view_reference(sv, NULL);
        }
    }

    if (!*sv) {
        *sv = st_create_texture_sampler_view_from_stobj(st->pipe, stObj,
                format, glsl_version);

    } else if ((*sv)->context != st->pipe) {
        /* Recreate view in correct context, use existing view as template */
        struct pipe_sampler_view *new_sv =
            st->pipe->create_sampler_view(st->pipe, stObj->pt, *sv);
        pipe_sampler_view_reference(sv, NULL);
        *sv = new_sv;
    }

    return *sv;
}
Пример #2
0
struct pipe_sampler_view *
st_get_texture_sampler_view_from_stobj(struct st_context *st,
                                       struct st_texture_object *stObj,
                                       const struct gl_sampler_object *samp,
                                       unsigned glsl_version)
{
   struct pipe_sampler_view **sv;

   if (!stObj || !stObj->pt) {
      return NULL;
   }

   sv = st_texture_get_sampler_view(st, stObj);

   if (*sv) {
      /* Debug check: make sure that the sampler view's parameters are
       * what they're supposed to be.
       */
      MAYBE_UNUSED struct pipe_sampler_view *view = *sv;
      assert(!check_sampler_swizzle(st, stObj, view, glsl_version));
      assert(get_sampler_view_format(st, stObj, samp) == view->format);
      assert(gl_target_to_pipe(stObj->base.Target) == view->target);
      if (stObj->base.Target == GL_TEXTURE_BUFFER) {
         unsigned base = stObj->base.BufferOffset;
         MAYBE_UNUSED unsigned size = MIN2(stObj->pt->width0 - base,
                              (unsigned) stObj->base.BufferSize);
         assert(view->u.buf.offset == base);
         assert(view->u.buf.size == size);
      }
      else {
         assert(stObj->base.MinLevel + stObj->base.BaseLevel ==
                view->u.tex.first_level);
         assert(last_level(stObj) == view->u.tex.last_level);
         assert(stObj->layer_override || stObj->base.MinLayer == view->u.tex.first_layer);
         assert(stObj->layer_override || last_layer(stObj) == view->u.tex.last_layer);
         assert(!stObj->layer_override ||
                (stObj->layer_override == view->u.tex.first_layer &&
                 stObj->layer_override == view->u.tex.last_layer));
      }
   }
   else {
      /* create new sampler view */
      enum pipe_format format = get_sampler_view_format(st, stObj, samp);

      *sv = st_create_texture_sampler_view_from_stobj(st, stObj,
                                                      format, glsl_version);

   }

   return *sv;
}
Пример #3
0
static struct pipe_sampler_view *
st_get_texture_sampler_view_from_stobj(struct st_texture_object *stObj,
                                       struct pipe_context *pipe,
                                       const struct gl_sampler_object *samp,
                                       enum pipe_format format)
{
    if (!stObj || !stObj->pt) {
        return NULL;
    }

    if (!stObj->sampler_view) {
        stObj->sampler_view =
            st_create_texture_sampler_view_from_stobj(pipe, stObj, samp, format);
    }

    return stObj->sampler_view;
}
Пример #4
0
static struct pipe_sampler_view *
st_get_texture_sampler_view_from_stobj(struct st_context *st,
                                       struct st_texture_object *stObj,
                                       const struct gl_sampler_object *samp,
				       enum pipe_format format)
{
   struct pipe_sampler_view **sv;

   if (!stObj || !stObj->pt) {
      return NULL;
   }

   sv = st_texture_get_sampler_view(st, stObj);

   if (stObj->base.StencilSampling &&
       util_format_is_depth_and_stencil(format))
      format = util_format_stencil_only(format);

   /* if sampler view has changed dereference it */
   if (*sv) {
      if (check_sampler_swizzle(stObj, *sv) ||
	  (format != (*sv)->format) ||
	  stObj->base.BaseLevel != (*sv)->u.tex.first_level) {
	 pipe_sampler_view_reference(sv, NULL);
      }
   }

   if (!*sv) {
      *sv = st_create_texture_sampler_view_from_stobj(st->pipe, stObj, samp, format);

   } else if ((*sv)->context != st->pipe) {
      /* Recreate view in correct context, use existing view as template */
      struct pipe_sampler_view *new_sv =
         st->pipe->create_sampler_view(st->pipe, stObj->pt, *sv);
      pipe_sampler_view_reference(sv, NULL);
      *sv = new_sv;
   }

   return *sv;
}