// Copyright (c) 2017-2020 Advanced Micro Devices, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

include::{generated}/meta/{refprefix}VK_AMD_texture_gather_bias_lod.txt[]

=== Other Extension Metadata

*Last Modified Date*::
    2017-03-21
*IP Status*::
    No known IP claims.
*Interactions and External Dependencies*::
  - This extension requires
    {spirv}/AMD/SPV_AMD_texture_gather_bias_lod.html[`SPV_AMD_texture_gather_bias_lod`]
*Contributors*::
  - Dominik Witczak, AMD
  - Daniel Rakos, AMD
  - Graham Sellers, AMD
  - Matthaeus G. Chajdas, AMD
  - Qun Lin, AMD
  - Rex Xu, AMD
  - Timothy Lottes, AMD

=== Description

This extension adds two related features.

Firstly, support for the following SPIR-V extension in Vulkan is added:

  * `SPV_AMD_texture_gather_bias_lod`

Secondly, the extension allows the application to query which formats can be
used together with the new function prototypes introduced by the SPIR-V
extension.

include::{generated}/interfaces/VK_AMD_texture_gather_bias_lod.txt[]

=== New SPIR-V Capabilities

  * <<spirvenv-capabilities-table-ImageGatherBiasLodAMD,
    code:ImageGatherBiasLodAMD>>

=== Examples

[source,c++]
--------------------------------------

struct VkTextureLODGatherFormatPropertiesAMD
{
    VkStructureType sType;
    const void*     pNext;
    VkBool32        supportsTextureGatherLODBiasAMD;
};

// ----------------------------------------------------------------------------------------
// How to detect if an image format can be used with the new function prototypes.
VkPhysicalDeviceImageFormatInfo2   formatInfo;
VkImageFormatProperties2           formatProps;
VkTextureLODGatherFormatPropertiesAMD textureLODGatherSupport;

textureLODGatherSupport.sType = VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD;
textureLODGatherSupport.pNext = nullptr;

formatInfo.sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2;
formatInfo.pNext  = nullptr;
formatInfo.format = ...;
formatInfo.type   = ...;
formatInfo.tiling = ...;
formatInfo.usage  = ...;
formatInfo.flags  = ...;

formatProps.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
formatProps.pNext = &textureLODGatherSupport;

vkGetPhysicalDeviceImageFormatProperties2(physical_device, &formatInfo, &formatProps);

if (textureLODGatherSupport.supportsTextureGatherLODBiasAMD == VK_TRUE)
{
    // physical device supports SPV_AMD_texture_gather_bias_lod for the specified
    // format configuration.
}
else
{
    // physical device does not support SPV_AMD_texture_gather_bias_lod for the
    // specified format configuration.
}
--------------------------------------

=== Version History

  * Revision 1, 2017-03-21 (Dominik Witczak)
    - Initial draft
