blob: 87111d76016cfed30362cd6172aff66e7531245c [file] [log] [blame]
// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef sw_Sampler_hpp
#define sw_Sampler_hpp
#include "Device/Config.hpp"
#include "System/Types.hpp"
#include "Vulkan/VkFormat.hpp"
namespace vk {
class Image;
}
namespace sw {
struct Mipmap
{
const void *buffer;
short4 uHalf;
short4 vHalf;
short4 wHalf;
int4 width;
int4 height;
int4 depth;
short4 onePitchP;
int4 pitchP;
int4 sliceP;
int4 samplePitchP;
int4 sampleMax;
};
struct Texture
{
Mipmap mipmap[MIPMAP_LEVELS];
float4 widthWidthHeightHeight;
float4 width;
float4 height;
float4 depth;
};
enum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
FILTER_POINT,
FILTER_GATHER,
FILTER_MIN_POINT_MAG_LINEAR,
FILTER_MIN_LINEAR_MAG_POINT,
FILTER_LINEAR,
FILTER_ANISOTROPIC,
FILTER_LAST = FILTER_ANISOTROPIC
};
enum MipmapType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
MIPMAP_NONE,
MIPMAP_POINT,
MIPMAP_LINEAR,
MIPMAP_LAST = MIPMAP_LINEAR
};
enum AddressingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
ADDRESSING_UNUSED,
ADDRESSING_WRAP,
ADDRESSING_CLAMP,
ADDRESSING_MIRROR,
ADDRESSING_MIRRORONCE,
ADDRESSING_BORDER, // Single color
ADDRESSING_SEAMLESS, // Border of pixels
ADDRESSING_CUBEFACE, // Cube face layer
ADDRESSING_TEXELFETCH,
ADDRESSING_LAST = ADDRESSING_TEXELFETCH
};
struct Sampler
{
VkImageViewType textureType;
vk::Format textureFormat;
FilterType textureFilter;
AddressingMode addressingModeU;
AddressingMode addressingModeV;
AddressingMode addressingModeW;
MipmapType mipmapFilter;
VkComponentMapping swizzle;
int gatherComponent;
bool highPrecisionFiltering;
bool compareEnable;
VkCompareOp compareOp;
VkBorderColor border;
bool unnormalizedCoordinates;
VkSamplerYcbcrModelConversion ycbcrModel;
bool studioSwing; // Narrow range
bool swappedChroma; // Cb/Cr components in reverse order
float mipLodBias = 0.0f;
float maxAnisotropy = 0.0f;
float minLod = 0.0f;
float maxLod = 0.0f;
bool is1D() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
return true;
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_3D:
case VK_IMAGE_VIEW_TYPE_CUBE:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return false;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
}
return false;
}
bool is2D() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
return true;
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_3D:
case VK_IMAGE_VIEW_TYPE_CUBE:
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return false;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
}
return false;
}
bool is3D() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_3D:
return true;
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_CUBE:
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return false;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
}
return false;
}
bool isCube() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_CUBE:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return true;
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_3D:
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
return false;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
}
return false;
}
bool isArrayed() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return true;
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_3D:
case VK_IMAGE_VIEW_TYPE_CUBE:
return false;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
}
return false;
}
};
} // namespace sw
#endif // sw_Sampler_hpp