/** Is the texture "complete" with respect to the given sampler state? */
static inline GLboolean
_mesa_is_texture_complete(const struct gl_texture_object *texObj,
- const struct gl_sampler_object *sampler)
+ const struct gl_sampler_object *sampler,
+ bool linear_as_nearest_for_int_tex)
{
struct gl_texture_image *img = texObj->Image[0][texObj->BaseLevel];
bool isMultisample = img && img->NumSamples >= 2;
(sampler->MagFilter != GL_NEAREST ||
(sampler->MinFilter != GL_NEAREST &&
sampler->MinFilter != GL_NEAREST_MIPMAP_NEAREST))) {
- /* If the format is integer, only nearest filtering is allowed */
- return GL_FALSE;
+ /* If the format is integer, only nearest filtering is allowed,
+ * but some applications (eg: Grid Autosport) uses the default
+ * filtering values.
+ */
+ if (texObj->_IsIntegerFormat &&
+ linear_as_nearest_for_int_tex) {
+ /* Skip return */
+ } else {
+ return GL_FALSE;
+ }
}
/* Section 8.17 (texture completeness) of the OpenGL 4.6 core profile spec:
texUnit->Sampler : &texObj->Sampler;
if (likely(texObj)) {
- if (_mesa_is_texture_complete(texObj, sampler))
+ if (_mesa_is_texture_complete(texObj, sampler,
+ ctx->Const.ForceIntegerTexNearest))
return texObj;
_mesa_test_texobj_completeness(ctx, texObj);
- if (_mesa_is_texture_complete(texObj, sampler))
+ if (_mesa_is_texture_complete(texObj, sampler,
+ ctx->Const.ForceIntegerTexNearest))
return texObj;
}
struct gl_sampler_object *sampler = texUnit->Sampler ?
texUnit->Sampler : &texObj->Sampler;
- if (!_mesa_is_texture_complete(texObj, sampler)) {
+ if (!_mesa_is_texture_complete(texObj, sampler,
+ ctx->Const.ForceIntegerTexNearest)) {
_mesa_test_texobj_completeness(ctx, texObj);
}
- if (_mesa_is_texture_complete(texObj, sampler)) {
+ if (_mesa_is_texture_complete(texObj, sampler,
+ ctx->Const.ForceIntegerTexNearest)) {
_mesa_reference_texobj(&texUnit->_Current, texObj);
complete = true;
break;
GET_CURRENT_CONTEXT(ctx);
texObj = _mesa_lookup_texture(ctx, texture);
- if (!_mesa_is_texture_complete(texObj, &texObj->Sampler))
+ if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
+ ctx->Const.ForceIntegerTexNearest))
_mesa_test_texobj_completeness(ctx, texObj);
return get_texture_handle(ctx, texObj, &texObj->Sampler);
* GetTextureSamplerHandleARB if the texture object specified by <texture>
* is not complete."
*/
- if (!_mesa_is_texture_complete(texObj, &texObj->Sampler)) {
+ if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
+ ctx->Const.ForceIntegerTexNearest)) {
_mesa_test_texobj_completeness(ctx, texObj);
- if (!_mesa_is_texture_complete(texObj, &texObj->Sampler)) {
+ if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
+ ctx->Const.ForceIntegerTexNearest)) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetTextureHandleARB(incomplete texture)");
return 0;
texObj = _mesa_lookup_texture(ctx, texture);
sampObj = _mesa_lookup_samplerobj(ctx, sampler);
- if (!_mesa_is_texture_complete(texObj, sampObj))
+ if (!_mesa_is_texture_complete(texObj, sampObj,
+ ctx->Const.ForceIntegerTexNearest))
_mesa_test_texobj_completeness(ctx, texObj);
return get_texture_handle(ctx, texObj, sampObj);
* GetTextureSamplerHandleARB if the texture object specified by <texture>
* is not complete."
*/
- if (!_mesa_is_texture_complete(texObj, sampObj)) {
+ if (!_mesa_is_texture_complete(texObj, sampObj,
+ ctx->Const.ForceIntegerTexNearest)) {
_mesa_test_texobj_completeness(ctx, texObj);
- if (!_mesa_is_texture_complete(texObj, sampObj)) {
+ if (!_mesa_is_texture_complete(texObj, sampObj,
+ ctx->Const.ForceIntegerTexNearest)) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetTextureSamplerHandleARB(incomplete texture)");
return 0;
GET_CURRENT_CONTEXT(ctx);
texObj = _mesa_lookup_texture(ctx, texture);
- if (!_mesa_is_texture_complete(texObj, &texObj->Sampler))
+ if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
+ ctx->Const.ForceIntegerTexNearest))
_mesa_test_texobj_completeness(ctx, texObj);
return get_image_handle(ctx, texObj, level, layered, layer, format);
* <texture> is not a three-dimensional, one-dimensional array, two
* dimensional array, cube map, or cube map array texture."
*/
- if (!_mesa_is_texture_complete(texObj, &texObj->Sampler)) {
+ if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
+ ctx->Const.ForceIntegerTexNearest)) {
_mesa_test_texobj_completeness(ctx, texObj);
- if (!_mesa_is_texture_complete(texObj, &texObj->Sampler)) {
+ if (!_mesa_is_texture_complete(texObj, &texObj->Sampler,
+ ctx->Const.ForceIntegerTexNearest)) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetImageHandleARB(incomplete texture)");
return 0;