Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add functions to support Standard Swizzle textures #515

Draft
wants to merge 19 commits into
base: main
Choose a base branch
from

Conversation

isplunke
Copy link

@isplunke isplunke commented Sep 17, 2024

Implement z-order curve "swizzling" for 2D and 3D textures to support the pixel order used for "Standard Swizzle" as defined by D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE.

These functions only perform the row-major <=> z-order curve operation. 64KB alignment, miptail packing, and other requirements are handled in other distinct operations.

@isplunke
Copy link
Author

@microsoft-github-policy-service agree company="Microsoft"

DirectXTex/DirectXTexImage.cpp Outdated Show resolved Hide resolved
DirectXTex/DirectXTex.h Outdated Show resolved Hide resolved
DirectXTex/DirectXTexImage.cpp Outdated Show resolved Hide resolved
DirectXTex/DirectXTexImage.cpp Outdated Show resolved Hide resolved
DirectXTex/DirectXTexImage.cpp Outdated Show resolved Hide resolved
_Use_decl_annotations_
HRESULT ScratchImage::InitializeImagesFromSwizzles(const Image* srcImage, size_t nImages, CP_FLAGS flags) noexcept
{
HRESULT hr = Initialize2D(srcImage[0].format, srcImage[0].width, srcImage[0].height, nImages, 1, flags);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This only works for 2D arrays without mipmaps. For some example of more general scenarios (mips, arrays with mips, volumes, volumes with mips) see TransformImage in DirectXTexMisc.cpp

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looked at TransformImage in DirectXTexMisc.cpp. I only saw mips being used in the 3d case. And even in that one, we're kind of just iterating for index = 0; index < nImages.

In the case: array of 2d images, we're iterating through each image independantley. So I don't think there's anything new to do there?

In the 3d case. I should separate slice (which is being swizzled) and layer( which is not being swizzled). But what order is the array of srcImages? layerMajor or sliceMajor?

Copy link
Member

@walbourn walbourn Sep 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the 3D case, my understanding is you would do:

size_t width = mdata.width;
size_t height = mdata.height;
size_t depth = mdata.depth;
for (size_t level = 0; level < mdata.mipLevels; ++level)
{
    auto destPtrBase = result.GetImage(level, 0, 0); // All slices of a given depth are always continuous in ScratchImage.
    for(size_t z = 0; z < depth; ++z)
    {
        auto srcImage = result.GetImage(level, 0, z);
        for(size_t h = 0; h < height; ++h)
        {
            for(size_t x = 0; 0 < width; ++w)
            {
                // swizzle using x, y, z copying from srcImage to destPtrBase + swizzleIndex
            }
        }
    }

    if (height > 1)
        height >>= 1;

    if (width > 1)
        width >>= 1;

    if (depth > 1)
        depth >>= 1;
}

DirectXTex/DirectXTexImage.cpp Outdated Show resolved Hide resolved
@walbourn walbourn self-assigned this Sep 18, 2024
@walbourn
Copy link
Member

Note for testing, I'll add coverage to the test suite which will likely just do a swizzle and deswizzle and make sure the bits match.

As for determining if the swizzle is correct, I probably need to make a test app that renders using WARP which supports standard swizzle.

@walbourn walbourn changed the title [Draft] Add functions to swizzle textures [Draft] Add functions to support Standard Swizzle textures Sep 18, 2024
@walbourn walbourn changed the title [Draft] Add functions to support Standard Swizzle textures Add functions to support Standard Swizzle textures Sep 25, 2024
@walbourn walbourn added the dx12 Direct3D 12 label Sep 25, 2024
- needs to be tested.  where to get dx12 boilerplate?  test just that texute still looks correct, or also test performance improves when roteated?
- maybe merge functions?  would then pass a boolean/enum to determine rowToSwizzle versus swizzleToRow

Added functions that converts pixel order from row major to standard swizzle and from standard swizzle to row major.

Functions for both 1 Image, and an array of Images.

Folwoing standard DirectXTex pattern: Uses Image and TexMetadata as input.  Outputs/initializes a ScratchImage.
Added new file to .vcxproj, other.vcxproj, and Cmake

Merged to/from functions togeather
memcpy src is const
added non-AVX2 deposit_bits
TODO what flags/threshold to use to re-Compress?
constexpr size_t MAX_TEXTURE_DIMENSION = 16384u;

#if defined(_M_X64) || defined(_M_ARM64) || __x86_64__ || __aarch64__
constexpr uint64_t MAX_TEXTURE_SIZE = 16384u * 16384u * 16u;

Check warning

Code scanning / PREfast

Arithmetic overflow: '*' operation causes overflow at compile time. Use a wider type to store the operands (io.1). Warning

Arithmetic overflow: '*' operation causes overflow at compile time. Use a wider type to store the operands (io.1).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add function to convert a texture to Standard Swizzle and vice versa
2 participants