Example #1
0
static void
convert_sampler(struct st_context *st,
                struct pipe_sampler_state *sampler,
                GLuint texUnit)
{
   const struct gl_texture_object *texobj;
   struct gl_context *ctx = st->ctx;
   const struct gl_sampler_object *msamp;
   GLenum texBaseFormat;

   texobj = ctx->Texture.Unit[texUnit]._Current;
   if (!texobj) {
      texobj = _mesa_get_fallback_texture(ctx, TEXTURE_2D_INDEX);
      msamp = &texobj->Sampler;
   } else {
      msamp = _mesa_get_samplerobj(ctx, texUnit);
   }

   texBaseFormat = _mesa_texture_base_format(texobj);

   memset(sampler, 0, sizeof(*sampler));
   sampler->wrap_s = gl_wrap_xlate(msamp->WrapS);
   sampler->wrap_t = gl_wrap_xlate(msamp->WrapT);
   sampler->wrap_r = gl_wrap_xlate(msamp->WrapR);

   sampler->min_img_filter = gl_filter_to_img_filter(msamp->MinFilter);
   sampler->min_mip_filter = gl_filter_to_mip_filter(msamp->MinFilter);
   sampler->mag_img_filter = gl_filter_to_img_filter(msamp->MagFilter);

   if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB)
      sampler->normalized_coords = 1;

   sampler->lod_bias = ctx->Texture.Unit[texUnit].LodBias + msamp->LodBias;

   sampler->min_lod = MAX2(msamp->MinLod, 0.0f);
   sampler->max_lod = msamp->MaxLod;
   if (sampler->max_lod < sampler->min_lod) {
      /* The GL spec doesn't seem to specify what to do in this case.
       * Swap the values.
       */
      float tmp = sampler->max_lod;
      sampler->max_lod = sampler->min_lod;
      sampler->min_lod = tmp;
      assert(sampler->min_lod <= sampler->max_lod);
   }

   /* For non-black borders... */
   if (msamp->BorderColor.ui[0] ||
       msamp->BorderColor.ui[1] ||
       msamp->BorderColor.ui[2] ||
       msamp->BorderColor.ui[3]) {
      const struct st_texture_object *stobj = st_texture_object_const(texobj);
      const GLboolean is_integer = texobj->_IsIntegerFormat;
      const struct pipe_sampler_view *sv = NULL;
      union pipe_color_union border_color;
      GLuint i;

      /* Just search for the first used view. We can do this because the
         swizzle is per-texture, not per context. */
      /* XXX: clean that up to not use the sampler view at all */
      for (i = 0; i < stobj->num_sampler_views; ++i) {
         if (stobj->sampler_views[i]) {
            sv = stobj->sampler_views[i];
            break;
         }
      }

      if (st->apply_texture_swizzle_to_border_color && sv) {
         const unsigned char swz[4] =
         {
            sv->swizzle_r,
            sv->swizzle_g,
            sv->swizzle_b,
            sv->swizzle_a,
         };

         st_translate_color(&msamp->BorderColor,
                            &border_color,
                            texBaseFormat, is_integer);

         util_format_apply_color_swizzle(&sampler->border_color,
                                         &border_color, swz, is_integer);
      } else {
         st_translate_color(&msamp->BorderColor,
                            &sampler->border_color,
                            texBaseFormat, is_integer);
      }
   }

   sampler->max_anisotropy = (msamp->MaxAnisotropy == 1.0 ?
                              0 : (GLuint) msamp->MaxAnisotropy);

   /* If sampling a depth texture and using shadow comparison */
   if ((texBaseFormat == GL_DEPTH_COMPONENT ||
        texBaseFormat == GL_DEPTH_STENCIL) &&
       msamp->CompareMode == GL_COMPARE_R_TO_TEXTURE) {
      sampler->compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE;
      sampler->compare_func = st_compare_func_to_pipe(msamp->CompareFunc);
   }

   sampler->seamless_cube_map =
      ctx->Texture.CubeMapSeamless || msamp->CubeMapSeamless;
}
Example #2
0
static void 
update_samplers(struct st_context *st)
{
   struct gl_vertex_program *vprog = st->ctx->VertexProgram._Current;
   struct gl_fragment_program *fprog = st->ctx->FragmentProgram._Current;
   const GLbitfield samplersUsed = (vprog->Base.SamplersUsed |
                                    fprog->Base.SamplersUsed);
   GLuint su;

   st->state.num_samplers = 0;

   /* loop over sampler units (aka tex image units) */
   for (su = 0; su < st->ctx->Const.MaxTextureImageUnits; su++) {
      struct pipe_sampler_state *sampler = st->state.samplers + su;

      memset(sampler, 0, sizeof(*sampler));

      if (samplersUsed & (1 << su)) {
         struct gl_texture_object *texobj;
         struct gl_texture_image *teximg;
         GLuint texUnit;

         if (fprog->Base.SamplersUsed & (1 << su))
            texUnit = fprog->Base.SamplerUnits[su];
         else
            texUnit = vprog->Base.SamplerUnits[su];

         texobj = st->ctx->Texture.Unit[texUnit]._Current;
         if (!texobj) {
            texobj = st_get_default_texture(st);
         }

         teximg = texobj->Image[0][texobj->BaseLevel];

         sampler->wrap_s = gl_wrap_xlate(texobj->WrapS);
         sampler->wrap_t = gl_wrap_xlate(texobj->WrapT);
         sampler->wrap_r = gl_wrap_xlate(texobj->WrapR);

         sampler->min_img_filter = gl_filter_to_img_filter(texobj->MinFilter);
         sampler->min_mip_filter = gl_filter_to_mip_filter(texobj->MinFilter);
         sampler->mag_img_filter = gl_filter_to_img_filter(texobj->MagFilter);

         if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB)
            sampler->normalized_coords = 1;

         sampler->lod_bias = st->ctx->Texture.Unit[su].LodBias;
         sampler->min_lod = MAX2(0.0f, texobj->MinLod);
         sampler->max_lod = MIN2(texobj->MaxLevel - texobj->BaseLevel,
                                 texobj->MaxLod);
         if (sampler->max_lod < sampler->min_lod) {
            /* The GL spec doesn't seem to specify what to do in this case.
             * Swap the values.
             */
            float tmp = sampler->max_lod;
            sampler->max_lod = sampler->min_lod;
            sampler->min_lod = tmp;
            assert(sampler->min_lod <= sampler->max_lod);
         }

         xlate_border_color(texobj->BorderColor,
                            teximg ? teximg->_BaseFormat : GL_RGBA,
                            sampler->border_color);

	 sampler->max_anisotropy = texobj->MaxAnisotropy;
         if (sampler->max_anisotropy > 1.0) {
            sampler->min_img_filter = PIPE_TEX_FILTER_ANISO;
            sampler->mag_img_filter = PIPE_TEX_FILTER_ANISO;
         }

         /* only care about ARB_shadow, not SGI shadow */
         if (texobj->CompareMode == GL_COMPARE_R_TO_TEXTURE) {
            sampler->compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE;
            sampler->compare_func
               = st_compare_func_to_pipe(texobj->CompareFunc);
         }

         st->state.num_samplers = su + 1;

         /*printf("%s su=%u non-null\n", __FUNCTION__, su);*/
         cso_single_sampler(st->cso_context, su, sampler);
      }
      else {
         /*printf("%s su=%u null\n", __FUNCTION__, su);*/
         cso_single_sampler(st->cso_context, su, NULL);
      }
   }

   cso_single_sampler_done(st->cso_context);
}
Example #3
0
static void
convert_sampler(struct st_context *st,
                struct pipe_sampler_state *sampler,
                GLuint texUnit)
{
    struct gl_texture_object *texobj;
    struct gl_context *ctx = st->ctx;
    struct gl_sampler_object *msamp;

    texobj = ctx->Texture.Unit[texUnit]._Current;
    if (!texobj) {
        texobj = _mesa_get_fallback_texture(ctx, TEXTURE_2D_INDEX);
    }

    msamp = _mesa_get_samplerobj(ctx, texUnit);

    memset(sampler, 0, sizeof(*sampler));
    sampler->wrap_s = gl_wrap_xlate(msamp->WrapS);
    sampler->wrap_t = gl_wrap_xlate(msamp->WrapT);
    sampler->wrap_r = gl_wrap_xlate(msamp->WrapR);

    sampler->min_img_filter = gl_filter_to_img_filter(msamp->MinFilter);
    sampler->min_mip_filter = gl_filter_to_mip_filter(msamp->MinFilter);
    sampler->mag_img_filter = gl_filter_to_img_filter(msamp->MagFilter);

    if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB)
        sampler->normalized_coords = 1;

    sampler->lod_bias = ctx->Texture.Unit[texUnit].LodBias + msamp->LodBias;

    sampler->min_lod = CLAMP(msamp->MinLod,
                             0.0f,
                             (GLfloat) texobj->MaxLevel - texobj->BaseLevel);
    sampler->max_lod = MIN2((GLfloat) texobj->MaxLevel - texobj->BaseLevel,
                            msamp->MaxLod);
    if (sampler->max_lod < sampler->min_lod) {
        /* The GL spec doesn't seem to specify what to do in this case.
         * Swap the values.
         */
        float tmp = sampler->max_lod;
        sampler->max_lod = sampler->min_lod;
        sampler->min_lod = tmp;
        assert(sampler->min_lod <= sampler->max_lod);
    }

    if (msamp->BorderColor.ui[0] ||
            msamp->BorderColor.ui[1] ||
            msamp->BorderColor.ui[2] ||
            msamp->BorderColor.ui[3]) {
        struct st_texture_object *stobj = st_texture_object(texobj);
        struct gl_texture_image *teximg;
        GLboolean is_integer = GL_FALSE;
        union pipe_color_union border_color;

        teximg = texobj->Image[0][texobj->BaseLevel];

        if (teximg) {
            is_integer = _mesa_is_enum_format_integer(teximg->InternalFormat);
        }

        if (st->apply_texture_swizzle_to_border_color && stobj->sampler_view) {
            const unsigned char swz[4] =
            {
                stobj->sampler_view->swizzle_r,
                stobj->sampler_view->swizzle_g,
                stobj->sampler_view->swizzle_b,
                stobj->sampler_view->swizzle_a,
            };

            st_translate_color(&msamp->BorderColor,
                               &border_color,
                               teximg ? teximg->_BaseFormat : GL_RGBA, is_integer);

            util_format_apply_color_swizzle(&sampler->border_color,
                                            &border_color, swz, is_integer);
        } else {
            st_translate_color(&msamp->BorderColor,
                               &sampler->border_color,
                               teximg ? teximg->_BaseFormat : GL_RGBA, is_integer);
        }
    }

    sampler->max_anisotropy = (msamp->MaxAnisotropy == 1.0 ?
                               0 : (GLuint) msamp->MaxAnisotropy);

    /* only care about ARB_shadow, not SGI shadow */
    if (msamp->CompareMode == GL_COMPARE_R_TO_TEXTURE) {
        sampler->compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE;
        sampler->compare_func
            = st_compare_func_to_pipe(msamp->CompareFunc);
    }

    sampler->seamless_cube_map =
        ctx->Texture.CubeMapSeamless || msamp->CubeMapSeamless;
}