Merge pull request #3930 from ReinUsesLisp/animal-borders
vk_rasterizer: Implement constant attributes
This commit is contained in:
		@@ -312,7 +312,9 @@ VKPipelineCache::DecompileShaders(const GraphicsPipelineCacheKey& key) {
 | 
			
		||||
        ASSERT(point_size != 0.0f);
 | 
			
		||||
    }
 | 
			
		||||
    for (std::size_t i = 0; i < Maxwell::NumVertexAttributes; ++i) {
 | 
			
		||||
        specialization.attribute_types[i] = fixed_state.vertex_input.attributes[i].Type();
 | 
			
		||||
        const auto& attribute = fixed_state.vertex_input.attributes[i];
 | 
			
		||||
        specialization.enabled_attributes[i] = attribute.enabled.Value() != 0;
 | 
			
		||||
        specialization.attribute_types[i] = attribute.Type();
 | 
			
		||||
    }
 | 
			
		||||
    specialization.ndc_minus_one_to_one = fixed_state.rasterizer.ndc_minus_one_to_one;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -877,14 +877,10 @@ void RasterizerVulkan::SetupVertexArrays(FixedPipelineState::VertexInput& vertex
 | 
			
		||||
 | 
			
		||||
    for (std::size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) {
 | 
			
		||||
        const auto& attrib = regs.vertex_attrib_format[index];
 | 
			
		||||
        if (!attrib.IsValid()) {
 | 
			
		||||
        if (attrib.IsConstant()) {
 | 
			
		||||
            vertex_input.SetAttribute(index, false, 0, 0, {}, {});
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [[maybe_unused]] const auto& buffer = regs.vertex_array[attrib.buffer];
 | 
			
		||||
        ASSERT(buffer.IsEnabled());
 | 
			
		||||
 | 
			
		||||
        vertex_input.SetAttribute(index, true, attrib.buffer, attrib.offset, attrib.type.Value(),
 | 
			
		||||
                                  attrib.size.Value());
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -741,8 +741,10 @@ private:
 | 
			
		||||
            if (!IsGenericAttribute(index)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const u32 location = GetGenericAttributeLocation(index);
 | 
			
		||||
            if (!IsAttributeEnabled(location)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            const auto type_descriptor = GetAttributeType(location);
 | 
			
		||||
            Id type;
 | 
			
		||||
            if (IsInputAttributeArray()) {
 | 
			
		||||
@@ -986,6 +988,10 @@ private:
 | 
			
		||||
        return stage == ShaderType::TesselationControl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool IsAttributeEnabled(u32 location) const {
 | 
			
		||||
        return stage != ShaderType::Vertex || specialization.enabled_attributes[location];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    u32 GetNumInputVertices() const {
 | 
			
		||||
        switch (stage) {
 | 
			
		||||
        case ShaderType::Geometry:
 | 
			
		||||
@@ -1201,16 +1207,20 @@ private:
 | 
			
		||||
                UNIMPLEMENTED_MSG("Unmanaged FrontFacing element={}", element);
 | 
			
		||||
                return {v_float_zero, Type::Float};
 | 
			
		||||
            default:
 | 
			
		||||
                if (IsGenericAttribute(attribute)) {
 | 
			
		||||
                    const u32 location = GetGenericAttributeLocation(attribute);
 | 
			
		||||
                    const auto type_descriptor = GetAttributeType(location);
 | 
			
		||||
                    const Type type = type_descriptor.type;
 | 
			
		||||
                    const Id attribute_id = input_attributes.at(attribute);
 | 
			
		||||
                    const std::vector elements = {element};
 | 
			
		||||
                    const Id pointer = ArrayPass(type_descriptor.scalar, attribute_id, elements);
 | 
			
		||||
                    return {OpLoad(GetTypeDefinition(type), pointer), type};
 | 
			
		||||
                if (!IsGenericAttribute(attribute)) {
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
                const u32 location = GetGenericAttributeLocation(attribute);
 | 
			
		||||
                if (!IsAttributeEnabled(location)) {
 | 
			
		||||
                    // Disabled attributes (also known as constant attributes) always return zero.
 | 
			
		||||
                    return {v_float_zero, Type::Float};
 | 
			
		||||
                }
 | 
			
		||||
                const auto type_descriptor = GetAttributeType(location);
 | 
			
		||||
                const Type type = type_descriptor.type;
 | 
			
		||||
                const Id attribute_id = input_attributes.at(attribute);
 | 
			
		||||
                const std::vector elements = {element};
 | 
			
		||||
                const Id pointer = ArrayPass(type_descriptor.scalar, attribute_id, elements);
 | 
			
		||||
                return {OpLoad(GetTypeDefinition(type), pointer), type};
 | 
			
		||||
            }
 | 
			
		||||
            UNIMPLEMENTED_MSG("Unhandled input attribute: {}", static_cast<u32>(attribute));
 | 
			
		||||
            return {v_float_zero, Type::Float};
 | 
			
		||||
 
 | 
			
		||||
@@ -88,7 +88,8 @@ struct Specialization final {
 | 
			
		||||
    u32 shared_memory_size{};
 | 
			
		||||
 | 
			
		||||
    // Graphics specific
 | 
			
		||||
    std::optional<float> point_size{};
 | 
			
		||||
    std::optional<float> point_size;
 | 
			
		||||
    std::bitset<Maxwell::NumVertexAttributes> enabled_attributes;
 | 
			
		||||
    std::array<Maxwell::VertexAttribute::Type, Maxwell::NumVertexAttributes> attribute_types{};
 | 
			
		||||
    bool ndc_minus_one_to_one{};
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user