Выделение памяти для текстуры

#graphics #directx #direct3d

#графика #directx #direct3d

Вопрос:

Я смотрел на WICTextureLoader.cpp файл, который является частью инструментария DirectX. И я пытаюсь понять этот фрагмент кода:

https://github.com/microsoft/DirectXTK/blob/master/Src/WICTextureLoader.cpp#L530

    // Allocate temporary memory for image
   uint64_t rowBytes = (uint64_t(twidth) * uint64_t(bpp)   7u) / 8u;
   uint64_t numBytes = rowBytes * uint64_t(theight);
 

Я понимаю, что вам нужно будет выделить ширину текстуры * бит на пиксель для одной строки текстуры. Но я не понимаю добавления 7 на пиксель, а затем деления всего на 8. О чем это?

Комментарии:

1. Это гарантирует, что количество строк в байтах делится на 8 и может содержать twidth * bpp.

2. @SimonMourier Хорошо, спасибо. Но почему так важно, чтобы пространство, выделенное в системной памяти для пиксельных данных, было кратно 8?

3. Это задокументировано здесь: docs.microsoft.com/en-us/windows/win32/api/wincodec / … шаг / шаг выровнен по некоторой границе (4, 8 и т.д.), Вот причина, по которой он вообще существует: docs.microsoft.com/en-us/windows/win32/medfound/image-stride

4. @SimonMourier Спасибо. Кроме того, я думаю, поскольку они выполняют биты на пиксель, а не байты, я полагаю, это также было бы необходимо, поскольку вы не можете выделить меньше байта.

Ответ №1:

bpp вот «биты на пиксель». Выражение округляется до следующего целого байта (8 бит).

Это классический шаблон C для «выравнивания» для выравнивания по степени 2, здесь выраженный как шаблон C .

     template<typename T>
    inline T AlignUp(T size, size_t alignment) noexcept
    {
        if (alignment > 0)
        {
            assert(((alignment - 1) amp; alignment) == 0);
            auto mask = static_cast<T>(alignment - 1);
            return (size   mask) amp; ~mask;
        }
        return size;
    }
 

Вместо / 8 этого я мог бы использовать битовые операторы (опять же, поскольку это степень двойки) и готово amp; ~8 , но / 8 кажется более понятным.