blob: 95973471b3d825b934fc16f6e3782bd25e5e5939 [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 sw {
struct Mipmap
{
const void *buffer;
ushort4 uHalf;
ushort4 vHalf;
ushort4 wHalf;
uint4 width;
uint4 height;
uint4 depth;
short4 onePitchP;
uint4 pitchP;
uint4 sliceP;
uint4 samplePitchP;
uint4 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;
VkClearColorValue customBorder;
bool unnormalizedCoordinates;
VkSamplerYcbcrModelConversion ycbcrModel;
bool studioSwing; // Narrow range
bool swappedChroma; // Cb/Cr components in reverse order
FilterType chromaFilter;
VkChromaLocation chromaXOffset;
VkChromaLocation chromaYOffset;
float mipLodBias = 0.0f;
float maxAnisotropy = 0.0f;
float minLod = -1000.0f;
float maxLod = 1000.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;
}
}
// Returns the number of coordinates required to sample the image,
// not including any array coordinate, which is indicated by isArrayed().
unsigned int dimensionality() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
return 1;
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
return 2;
case VK_IMAGE_VIEW_TYPE_3D:
case VK_IMAGE_VIEW_TYPE_CUBE:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return 3;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
return 0;
}
}
};
} // namespace sw
#endif // sw_Sampler_hpp