
/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#ifndef VulkanTestContext_DEFINED
#define VulkanTestContext_DEFINED

#ifdef SK_VULKAN

#include "GrTypes.h"
#include "vk/GrVkBackendContext.h"

class SkSurface;
class GrContext;

class VulkanTestContext {
public:
    ~VulkanTestContext();

    // each platform will have to implement these in its CPP file
    VkSurfaceKHR createVkSurface(void* platformData);
    bool canPresent(uint32_t queueFamilyIndex);

    static VulkanTestContext* Create(void* platformData, int msaaSampleCount) {
        VulkanTestContext* ctx = new VulkanTestContext(platformData, msaaSampleCount);
        if (!ctx->isValid()) {
            delete ctx;
            return nullptr;
        }
        return ctx;
    }

    SkSurface* getBackbufferSurface();
    void swapBuffers();

    bool makeCurrent() { return true; }
    int getStencilBits() { return 0;  }
    int getSampleCount() { return 0; }

    bool isValid() { return SkToBool(fBackendContext.get()); }

    void resize(uint32_t w, uint32_t h) {
        this->createSwapchain(w, h); 
    }

    GrBackendContext getBackendContext() { return (GrBackendContext)fBackendContext.get(); }

private:
    VulkanTestContext();
    VulkanTestContext(void*, int msaaSampleCount);
    void initializeContext(void*);
    void destroyContext();

    struct BackbufferInfo {
        uint32_t        fImageIndex;          // image this is associated with
        VkSemaphore     fAcquireSemaphore;    // we signal on this for acquisition of image
        VkSemaphore     fRenderSemaphore;     // we wait on this for rendering to be done
        VkCommandBuffer fTransitionCmdBuffers[2]; // to transition layout between present and render
        VkFence         fUsageFences[2];      // used to ensure this data is no longer used on GPU
    };

    BackbufferInfo* getAvailableBackbuffer();
    bool createSwapchain(uint32_t width, uint32_t height);
    void createBuffers();
    void destroyBuffers();

    SkAutoTUnref<const GrVkBackendContext> fBackendContext;

    GrContext*        fContext;
    VkSurfaceKHR      fSurface;
    VkSwapchainKHR    fSwapchain;
    uint32_t          fPresentQueueIndex;
    VkQueue           fPresentQueue;
    int               fWidth;
    int               fHeight;
    GrPixelConfig     fPixelConfig;

    uint32_t          fImageCount;
    VkImage*          fImages;         // images in the swapchain
    VkImageLayout*    fImageLayouts;   // layouts of these images when not color attachment
    sk_sp<SkSurface>* fSurfaces;       // wrapped surface for those images
    VkCommandPool     fCommandPool;
    BackbufferInfo*   fBackbuffers;
    uint32_t          fCurrentBackbufferIndex;
};

#endif // SK_VULKAN

#endif
