// Copyright 2014-2021 The Khronos Group, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

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

=== Other Extension Metadata

*Last Modified Date*::
    2019-08-17
*Interactions and External Dependencies*::
  - Promoted to Vulkan 1.2 Core
*Contributors*::
  - Tobias Hector, Imagination Technologies
  - Jon Leech, Khronos

=== Description

`VK_KHR_sampler_mirror_clamp_to_edge` extends the set of sampler address
modes to include an additional mode
(ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE) that effectively uses a
texture map twice as large as the original image in which the additional
half of the new image is a mirror image of the original image.

This new mode relaxes the need to generate images whose opposite edges match
by using the original image to generate a matching "`mirror image`".
This mode allows the texture to be mirrored only once in the negative s, t,
and r directions.

=== Promotion to Vulkan 1.2

All functionality in this extension is included in core Vulkan 1.2.
However, if Vulkan 1.2 is supported and this extension is not, the
elink:VkSamplerAddressMode
ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE is optional.
Since the original extension did not use an author suffix on the enum
ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE, it is used by both core
and extension implementations.

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

=== Example

Creating a sampler with the new address mode in each dimension


[source,c++]
----------------------------------------
    VkSamplerCreateInfo createInfo =
    {
        VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO // sType
        // Other members set to application-desired values
    };

    createInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
    createInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
    createInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;

    VkSampler sampler;
    VkResult result = vkCreateSampler(
        device,
        &createInfo,
        &sampler);
----------------------------------------

=== Issues

1) Why are both KHR and core versions of the
ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE token present?

*RESOLVED*: This functionality was intended to be required in Vulkan 1.0.
We realized shortly before public release that not all implementations could
support it, and moved the functionality into an optional extension, but did
not apply the KHR extension suffix.
Adding a KHR-suffixed alias of the non-suffixed enum has been done to comply
with our own naming rules.

In a related change, before spec revision 1.1.121 this extension was
hardwiring into the spec Makefile so it was always included with the
Specification, even in the core-only versions.
This has now been reverted, and it is treated as any other extension.

=== Version History

 * Revision 1, 2016-02-16 (Tobias Hector)
   - Initial draft
 * Revision 2, 2019-08-14 (Jon Leech)
   - Add KHR-suffixed alias of non-suffixed enum.
 * Revision 3, 2019-08-17 (Jon Leech)
   - Add an issue explaining the reason for the extension API not being
     suffixed with KHR.
