/*------------------------------------------------------------------------
 * Vulkan Conformance Tests
 * ------------------------
 *
 * Copyright (c) 2017 The Khronos Group Inc.
 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Protected memory tests
 *//*--------------------------------------------------------------------*/

#include "vktProtectedMemTests.hpp"

#include "vktTestCase.hpp"
#include "vktTestGroupUtil.hpp"

#include "vktProtectedMemAttachmentLoadTests.hpp"
#include "vktProtectedMemAttachmentClearTests.hpp"
#include "vktProtectedMemCopyImageTests.hpp"
#include "vktProtectedMemBlitImageTests.hpp"
#include "vktProtectedMemClearColorImageTests.hpp"
#include "vktProtectedMemFillUpdateCopyBufferTests.hpp"
#include "vktProtectedMemCopyImageToBufferTests.hpp"
#include "vktProtectedMemCopyBufferToImageTests.hpp"
#include "vktProtectedMemStorageBufferTests.hpp"
#include "vktProtectedMemShaderImageAccessTests.hpp"
#include "vktProtectedMemWsiSwapchainTests.hpp"
#include "vktProtectedMemYCbCrConversionTests.hpp"
#include "vktProtectedMemWorkgroupStorageTests.hpp"

namespace vkt
{
namespace ProtectedMem
{

tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx)
{
	de::MovePtr<tcu::TestCaseGroup> protectedTests (new tcu::TestCaseGroup(testCtx, "protected_memory", "Protected Memory Tests"));

	// Attachment test case group
	{
		de::MovePtr<tcu::TestCaseGroup> attachmentTestGroup (new tcu::TestCaseGroup(testCtx, "attachment", "Protected Memory Attachment Tests"));
		attachmentTestGroup->addChild(createAttachmentLoadTests(testCtx));
		attachmentTestGroup->addChild(createAttachmentClearTests(testCtx));
		protectedTests->addChild(attachmentTestGroup.release());
	}

	// Image test case group
	{
		de::MovePtr<tcu::TestCaseGroup> imageTestGroup (new tcu::TestCaseGroup(testCtx, "image", "Protected Memory Image Tests"));
		imageTestGroup->addChild(createCopyImageTests(testCtx));
		imageTestGroup->addChild(createBlitImageTests(testCtx));
		imageTestGroup->addChild(createClearColorImageTests(testCtx));
		imageTestGroup->addChild(createCopyBufferToImageTests(testCtx));
		imageTestGroup->addChild(createShaderImageAccessTests(testCtx));
		protectedTests->addChild(imageTestGroup.release());
	}

	// Buffer test case group
	{
		de::MovePtr<tcu::TestCaseGroup> bufferTestGroup (new tcu::TestCaseGroup(testCtx, "buffer", "Protected Memory Buffer Tests"));
		bufferTestGroup->addChild(createFillBufferTests(testCtx));
		bufferTestGroup->addChild(createUpdateBufferTests(testCtx));
		bufferTestGroup->addChild(createCopyBufferTests(testCtx));
		bufferTestGroup->addChild(createCopyImageToFloatBufferTests(testCtx));
		protectedTests->addChild(bufferTestGroup.release());
	}

	// Storage buffer test case group
	{
		de::MovePtr<tcu::TestCaseGroup> ssboTestGroup (new tcu::TestCaseGroup(testCtx, "ssbo", "Storage Buffer Tests"));
		ssboTestGroup->addChild(createReadStorageBufferTests(testCtx));
		ssboTestGroup->addChild(createWriteStorageBufferTests(testCtx));
		ssboTestGroup->addChild(createAtomicStorageBufferTests(testCtx));
		protectedTests->addChild(ssboTestGroup.release());
	}

	{
		de::MovePtr<tcu::TestCaseGroup> interactionTestGroup (new tcu::TestCaseGroup(testCtx, "interaction", "Various tests which interacts with other extensions"));
		interactionTestGroup->addChild(createSwapchainTests(testCtx));
		interactionTestGroup->addChild(createYCbCrConversionTests(testCtx));
		protectedTests->addChild(interactionTestGroup.release());
	}

	protectedTests->addChild(createWorkgroupStorageTests(testCtx));

	return protectedTests.release();

}

} // ProtectedMem
} // vkt
