TLayoutQualifier JoinLayoutQualifiers(TLayoutQualifier leftQualifier, TLayoutQualifier rightQualifier, const TSourceLoc &rightQualifierLocation, TDiagnostics *diagnostics) { TLayoutQualifier joinedQualifier = leftQualifier; if (rightQualifier.location != -1) { joinedQualifier.location = rightQualifier.location; ++joinedQualifier.locationsSpecified; } if (rightQualifier.matrixPacking != EmpUnspecified) { joinedQualifier.matrixPacking = rightQualifier.matrixPacking; } if (rightQualifier.blockStorage != EbsUnspecified) { joinedQualifier.blockStorage = rightQualifier.blockStorage; } for (size_t i = 0u; i < rightQualifier.localSize.size(); ++i) { if (rightQualifier.localSize[i] != -1) { if (joinedQualifier.localSize[i] != -1 && joinedQualifier.localSize[i] != rightQualifier.localSize[i]) { diagnostics->error(rightQualifierLocation, "Cannot have multiple different work group size specifiers", getWorkGroupSizeString(i), ""); } joinedQualifier.localSize[i] = rightQualifier.localSize[i]; } } return joinedQualifier; }
TLayoutQualifier JoinLayoutQualifiers(TLayoutQualifier leftQualifier, TLayoutQualifier rightQualifier, const TSourceLoc &rightQualifierLocation, TDiagnostics *diagnostics) { TLayoutQualifier joinedQualifier = leftQualifier; if (rightQualifier.location != -1) { joinedQualifier.location = rightQualifier.location; ++joinedQualifier.locationsSpecified; } if (rightQualifier.yuv != false) { joinedQualifier.yuv = rightQualifier.yuv; } if (rightQualifier.binding != -1) { joinedQualifier.binding = rightQualifier.binding; } if (rightQualifier.offset != -1) { joinedQualifier.offset = rightQualifier.offset; } if (rightQualifier.matrixPacking != EmpUnspecified) { joinedQualifier.matrixPacking = rightQualifier.matrixPacking; } if (rightQualifier.blockStorage != EbsUnspecified) { joinedQualifier.blockStorage = rightQualifier.blockStorage; } for (size_t i = 0u; i < rightQualifier.localSize.size(); ++i) { if (rightQualifier.localSize[i] != -1) { if (joinedQualifier.localSize[i] != -1 && joinedQualifier.localSize[i] != rightQualifier.localSize[i]) { diagnostics->error(rightQualifierLocation, "Cannot have multiple different work group size specifiers", getWorkGroupSizeString(i)); } joinedQualifier.localSize[i] = rightQualifier.localSize[i]; } } if (rightQualifier.numViews != -1) { joinedQualifier.numViews = rightQualifier.numViews; } if (rightQualifier.imageInternalFormat != EiifUnspecified) { joinedQualifier.imageInternalFormat = rightQualifier.imageInternalFormat; } if (rightQualifier.primitiveType != EptUndefined) { if (joinedQualifier.primitiveType != EptUndefined && joinedQualifier.primitiveType != rightQualifier.primitiveType) { diagnostics->error(rightQualifierLocation, "Cannot have multiple different primitive specifiers", getGeometryShaderPrimitiveTypeString(rightQualifier.primitiveType)); } joinedQualifier.primitiveType = rightQualifier.primitiveType; } if (rightQualifier.invocations != 0) { if (joinedQualifier.invocations != 0 && joinedQualifier.invocations != rightQualifier.invocations) { diagnostics->error(rightQualifierLocation, "Cannot have multiple different invocations specifiers", "invocations"); } joinedQualifier.invocations = rightQualifier.invocations; } if (rightQualifier.maxVertices != -1) { if (joinedQualifier.maxVertices != -1 && joinedQualifier.maxVertices != rightQualifier.maxVertices) { diagnostics->error(rightQualifierLocation, "Cannot have multiple different max_vertices specifiers", "max_vertices"); } joinedQualifier.maxVertices = rightQualifier.maxVertices; } return joinedQualifier; }