Program Listing for File pipelineSettings.cpp

Return to documentation for file (PrismEngine/src/pipelineSettings.cpp)

#include "pipelineSettings.h"

bool prism::PGC::utils::PipelineSettings::colorBlendAttachmentsEqual(const std::vector<VkPipelineColorBlendAttachmentState>& a,
    const std::vector<VkPipelineColorBlendAttachmentState>& b) {
    if (a.size() != b.size()) return false;

    for (size_t i = 0; i < a.size(); ++i) {
        const auto& attA = a[i];
        const auto& attB = b[i];

        if (attA.blendEnable != attB.blendEnable ||
            attA.srcColorBlendFactor != attB.srcColorBlendFactor ||
            attA.dstColorBlendFactor != attB.dstColorBlendFactor ||
            attA.colorBlendOp != attB.colorBlendOp ||
            attA.srcAlphaBlendFactor != attB.srcAlphaBlendFactor ||
            attA.dstAlphaBlendFactor != attB.dstAlphaBlendFactor ||
            attA.alphaBlendOp != attB.alphaBlendOp ||
            attA.colorWriteMask != attB.colorWriteMask) {
            return false;
        }
    }
    return true;
}

bool prism::PGC::utils::PipelineSettings::dynamicStatesEqual(const std::vector<VkDynamicState>& a,
    const std::vector<VkDynamicState>& b) {
    if (a.size() != b.size()) return false;

    for (size_t i = 0; i < a.size(); ++i) {
        if (a[i] != b[i]) return false;
    }
    return true;
}

size_t prism::PGC::utils::PipelineSettings::getHash() const {
    return std::hash<prism::PGC::utils::PipelineSettings>{}(*this);
}


bool prism::PGC::utils::PipelineSettings::operator==(const PipelineSettings& other) const
{
    return shaders.vertexShaderFilename == other.shaders.vertexShaderFilename &&
        shaders.fragmentShaderFilename == other.shaders.fragmentShaderFilename &&
        shaders.shadersDirectory == other.shaders.shadersDirectory &&
        inputAssembly.topology == other.inputAssembly.topology &&
        inputAssembly.primitiveRestartEnable == other.inputAssembly.primitiveRestartEnable &&
        rasterization.polygonMode == other.rasterization.polygonMode &&
        rasterization.lineWidth == other.rasterization.lineWidth &&
        rasterization.cullMode == other.rasterization.cullMode &&
        rasterization.frontFace == other.rasterization.frontFace &&
        rasterization.depthClampEnable == other.rasterization.depthClampEnable &&
        rasterization.rasterizerDiscardEnable == other.rasterization.rasterizerDiscardEnable &&
        rasterization.depthBiasEnable == other.rasterization.depthBiasEnable &&
        depthStencil.depthTestEnable == other.depthStencil.depthTestEnable &&
        depthStencil.depthWriteEnable == other.depthStencil.depthWriteEnable &&
        depthStencil.depthCompareOp == other.depthStencil.depthCompareOp &&
        depthStencil.depthBoundsTestEnable == other.depthStencil.depthBoundsTestEnable &&
        depthStencil.minDepthBounds == other.depthStencil.minDepthBounds &&
        depthStencil.maxDepthBounds == other.depthStencil.maxDepthBounds &&
        depthStencil.stencilTestEnable == other.depthStencil.stencilTestEnable &&
        multisample.sampleShadingEnable == other.multisample.sampleShadingEnable &&
        multisample.rasterizationSamples == other.multisample.rasterizationSamples &&
        multisample.strategy == other.multisample.strategy &&
        colorBlend.logicOpEnable == other.colorBlend.logicOpEnable &&
        colorBlend.logicOp == other.colorBlend.logicOp &&
        colorBlend.blendConstants[0] == other.colorBlend.blendConstants[0] &&
        colorBlend.blendConstants[1] == other.colorBlend.blendConstants[1] &&
        colorBlend.blendConstants[2] == other.colorBlend.blendConstants[2] &&
        colorBlend.blendConstants[3] == other.colorBlend.blendConstants[3] &&
        colorBlend.attachments.size() == other.colorBlend.attachments.size() &&
        dynamicState.dynamicStates == other.dynamicState.dynamicStates &&
        colorBlendAttachmentsEqual(colorBlend.attachments, other.colorBlend.attachments) &&
        dynamicStatesEqual(dynamicState.dynamicStates, other.dynamicState.dynamicStates) &&
        viewportState.viewportCount == other.viewportState.viewportCount &&
        viewportState.scissorCount == other.viewportState.scissorCount;
}

VkPipelineColorBlendAttachmentState prism::PGC::utils::createColorBlendAttachment(bool blendEnable)
{
    VkPipelineColorBlendAttachmentState attachment = {};
    attachment.blendEnable = blendEnable ? VK_TRUE : VK_FALSE;
    attachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT |
        VK_COLOR_COMPONENT_G_BIT |
        VK_COLOR_COMPONENT_B_BIT |
        VK_COLOR_COMPONENT_A_BIT;

    if (blendEnable) {
        attachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
        attachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
        attachment.colorBlendOp = VK_BLEND_OP_ADD;
        attachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
        attachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
        attachment.alphaBlendOp = VK_BLEND_OP_ADD;
    }
    else {
        attachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE;
        attachment.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO;
        attachment.colorBlendOp = VK_BLEND_OP_ADD;
        attachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
        attachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
        attachment.alphaBlendOp = VK_BLEND_OP_ADD;
    }

    return attachment;
}