Войти
ПрограммированиеФорумГрафика

Vulkan API (вышел!) (381 стр)

Страницы: 1380 381 382 383387 Следующая »
#5700
13:57, 23 сен. 2019

Я для кеша собираюсь использовать структуру, которую я использовал для кеша permutation'ов шейдера.

struct M2ShaderCacheRecord {
    int vertexShader;
    int pixelShader;
    bool unlit;
    bool alphaTestOn;
    bool unFogged;
    bool unShadowed;
    int boneInfluences;


    bool operator==(const M2ShaderCacheRecord &other) const {
        return
            (vertexShader == other.vertexShader) &&
            (pixelShader == other.pixelShader) &&
            (alphaTestOn == other.alphaTestOn) &&
            (unlit == other.unlit) &&
            (unFogged == other.unFogged) &&
            (unShadowed == other.unShadowed) &&
            (boneInfluences == other.boneInfluences);
    };
};
....
struct M2ShaderCacheRecordHasher {
        std::size_t operator()(const M2ShaderCacheRecord& k) const {
            using std::hash;
            return hash<int>{}(k.vertexShader) ^ (hash<int>{}(k.pixelShader)) ^
                   (hash<bool>{}(k.unlit)) ^
                   (hash<bool>{}(k.alphaTestOn) << 8) ^
                   (hash<bool>{}(k.unFogged) << 16) ^
                   (hash<bool>{}(k.unShadowed) << 24);
        };
    };

//Hash table itself
std::unordered_map<M2ShaderCacheRecord, std::weak_ptr<IShaderPermutation>, M2ShaderCacheRecordHasher> m2ShaderCache;

Что-то вроде этого. Насколько быстро будет работает - хз.


#5701
14:26, 23 сен. 2019

Deamon
> Насколько быстро будет работает - хз.

сколько у тебя пейплайнов всего ?

#5702
(Правка: 14:37) 14:36, 23 сен. 2019

innuendo
Пока все тупо. Один mesh - один pipeline. Позже это соптимизирую, но...
Каждый mesh может иметь свой:

1) Blend mode (всего их 13)
2) Depth test enable (true/false)
3) Depth write enable (true/false)
4) BackFaceCulling (VK_CULL_MODE_BACK_BIT/VK_CULL_MODE_NONE)
5) Шейдер (всего 5 штук)

Т.е. теоритический максимум - 13*2*2*2*5 = 520 штук

#5703
(Правка: 15:29) 15:28, 23 сен. 2019

Известно что входит в pipelineCache - есть ли спецификация или драйвер сам решает? Конкретнее: есть два графических пайплайна, у которых все одинаково, но заданы разные фиксированные (не динамические) вьюпорты; будет ли кеш одного пайплайна валиден для другого?

#5704
17:08, 23 сен. 2019

BingoBongo
> Известно что входит в pipelineCache - есть ли спецификация или драйвер сам
> решает?

вот что есть https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/… ineCache.html

#5705
17:47, 23 сен. 2019

innuendo
Да я эт видел.

С одной стороны:
"Reuse between pipelines is achieved by passing the same pipeline cache object when creating multiple related pipelines". Но что конкретно подразумевает "related pipelines"?

С другой стороны:
"The contents of the pipeline cache objects are managed by the implementation." явно указывает, что содержимое определяет драйвер. Еще где-то читал, что ни что так не разнится от вендора к вендору в вулкане как имплементация кеша пайплайнов.

Вообще, похоже, что сейчас кеш сделан на отвяжитесь: он хоть и работает, но содержимое и совместимость кеша похожих пайплайнов вендоры определяют сами, значит валидность кеша достоверно можно проверить охватом вообще всех параметров пайплайна, что как-то глупо.

#5706
(Правка: 18:02) 17:49, 23 сен. 2019

BingoBongo
> Еще где-то читал, что ни что так не разнится от вендора к вендору в вулкане как
> имплементация кеша пайплайнов.
ну да - весь смысл иметь максимальное приближение к железке

#5707
19:11, 23 сен. 2019

И кстати DX12 вроде делает то же самое. В один большой игрулине есть папочка, куда кладется сгенерированный с кешом чего-то от DX12.
Если бы была бинарная совместимость, они бы просто распространяли такой файлик в составе дистрибутива. Но нет!

#5708
19:20, 23 сен. 2019

Deamon
> Если бы была бинарная совместимость, они бы просто распространяли такой файлик
> в составе дистрибутива. Но нет!
какой смысл в бинарной совместимости ? железки внутри разные же

#5709
19:40, 23 сен. 2019

Deamon
Бинарной совместимости даже на opengl нет.

#5710
23:06, 23 сен. 2019

Deamon
> Если бы была бинарная совместимость, они бы просто распространяли такой файлик
> в составе дистрибутива.
Некоторые так делают под свитч. Там то бинарная совместимость есть.

#5711
23:38, 23 сен. 2019

Deamon
> И кстати DX12 вроде делает то же самое. В один большой игрулине есть папочка,
> куда кладется сгенерированный с кешом чего-то от DX12.
> Если бы была бинарная совместимость, они бы просто распространяли такой файлик
> в составе дистрибутива. Но нет!

помоему так начиная с DX9 делают
компилируют шейдеры, при первой загрузке, и складывают для быстрой загрузки локально

/A\
> Некоторые так делают под свитч. Там то бинарная совместимость есть.

ну какбы еще в xbox360 так делали, может и раньше учитывая что в PS2 уже были шейдеры

#5712
(Правка: 23:50) 23:44, 23 сен. 2019

/A\
> Кэш можно не использовать, драйвер сам кэширует, если это специально не
> отключено в настройках.
>

указать лимит кэша и места хранения кэша можно хоть на OGL4, в Cemu так делают (там около гагабайта шейдеров прекомпилированных хранят, и все работает(почти всегда, когда перестает работать пол часа все шейдера перекомпилировать))
(помоему даже в открытом Dolphin, который переписали на вулкан и DX12, тоже хранят шейдеры скомпилированные, и реализовали компиляцию на ходу без лагов в Dx12)

#5713
0:59, 24 сен. 2019

Вот только вчера погонял бетту "Modern Warfare", так там мне дали выбор - или ждешь пол часа пока мы "загрузим шейдера" или все будет тормозить. Естественно попробовал без "загрузки" - таки да, все тормозило так жутко, что на экране было просто слайдшоу.

#5714
3:31, 24 сен. 2019

Danilw
> помоему так начиная с DX9 делают
> компилируют шейдеры, при первой загрузке, и складывают для быстрой загрузки
> локально

по-разному делают, смотря какие подходы

Страницы: 1380 381 382 383387 Следующая »
ПрограммированиеФорумГрафика