1fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
2fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth/*
3fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth * Copyright 2016 Google Inc.
4fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth *
5fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth * Use of this source code is governed by a BSD-style license that can be
6fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth * found in the LICENSE file.
7fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth */
8fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
9fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth#ifndef GrVkTypes_DEFINED
10fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth#define GrVkTypes_DEFINED
11fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
122c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman#include "GrExternalTextureData.h"
131e305ba0d6a4237020d36234e9e286d3b0489401jvanverth#include "GrTypes.h"
14e50f3e75392d7be8ae89df8f55b1700100c34ad7jvanverth#include "vk/GrVkDefines.h"
15fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
16fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth/**
17fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth * KHR_debug
18fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth */
19fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth/*typedef void (GR_GL_FUNCTION_TYPE* GrVkDEBUGPROC)(GrVkenum source,
20fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth                                                  GrVkenum type,
21fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth                                                  GrVkuint id,
22fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth                                                  GrVkenum severity,
23fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth                                                  GrVksizei length,
24fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth                                                  const GrVkchar* message,
25fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth                                                  const void* userParam);*/
26fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
27fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
28fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
29fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth///////////////////////////////////////////////////////////////////////////////
30fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth/**
31ab527a5bbfb1eae4f99a1435d349a44d00477d82egdaniel * Types for interacting with Vulkan resources created externally to Skia. GrBackendObjects for
32b2df0c2702329be6380a943d548e7377a51d8565egdaniel * Vulkan textures are really const GrVkImageInfo*
33fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth */
341e305ba0d6a4237020d36234e9e286d3b0489401jvanverthstruct GrVkAlloc {
351e305ba0d6a4237020d36234e9e286d3b0489401jvanverth    VkDeviceMemory fMemory;  // can be VK_NULL_HANDLE iff Tex is an RT and uses borrow semantics
361e305ba0d6a4237020d36234e9e286d3b0489401jvanverth    VkDeviceSize   fOffset;
376b6ffc4ab6ecee9f46425a5467ef0fbebbb8c9cdjvanverth    VkDeviceSize   fSize;    // this can be indeterminate iff Tex uses borrow semantics
389d54afc38b171c01a03b34e773d154fcf83d97dcjvanverth    uint32_t       fFlags;
399d54afc38b171c01a03b34e773d154fcf83d97dcjvanverth
409d54afc38b171c01a03b34e773d154fcf83d97dcjvanverth    enum Flag {
419d54afc38b171c01a03b34e773d154fcf83d97dcjvanverth        kNoncoherent_Flag = 0x1,   // memory must be flushed to device after mapping
429d54afc38b171c01a03b34e773d154fcf83d97dcjvanverth    };
431e305ba0d6a4237020d36234e9e286d3b0489401jvanverth};
441e305ba0d6a4237020d36234e9e286d3b0489401jvanverth
45b2df0c2702329be6380a943d548e7377a51d8565egdanielstruct GrVkImageInfo {
467888f780d85ced5c572f0227c16b88ed59bcffe5brianosman    /**
477888f780d85ced5c572f0227c16b88ed59bcffe5brianosman     * If the image's format is sRGB (GrVkFormatIsSRGB returns true), then the image must have
487888f780d85ced5c572f0227c16b88ed59bcffe5brianosman     * been created with VkImageCreateFlags containing VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT.
497888f780d85ced5c572f0227c16b88ed59bcffe5brianosman     */
50fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth    VkImage        fImage;
511e305ba0d6a4237020d36234e9e286d3b0489401jvanverth    GrVkAlloc      fAlloc;
52fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth    VkImageTiling  fImageTiling;
53fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth    VkImageLayout  fImageLayout;
5458a8d9214a70e0f6c81c88a8b0b563c06bf0f70eegdaniel    VkFormat       fFormat;
552af0f1b014b9aabb6119bf66fac20e4cd3a8279bjvanverth    uint32_t       fLevelCount;
56b2df0c2702329be6380a943d548e7377a51d8565egdaniel
57b2df0c2702329be6380a943d548e7377a51d8565egdaniel    // This gives a way for a client to update the layout of the Image if they change the layout
58b2df0c2702329be6380a943d548e7377a51d8565egdaniel    // while we're still holding onto the wrapped texture. They will first need to get a handle
59b2df0c2702329be6380a943d548e7377a51d8565egdaniel    // to our internal GrVkImageInfo by calling getTextureHandle on a GrVkTexture.
60b2df0c2702329be6380a943d548e7377a51d8565egdaniel    void updateImageLayout(VkImageLayout layout) { fImageLayout = layout; }
61fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth};
62fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
632c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osmanclass GrVkExternalTextureData : public GrExternalTextureData {
642c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osmanpublic:
65fe3b51636d4216c4ea6cb74ed0964c1d315ca487Brian Osman    GrVkExternalTextureData(const GrVkImageInfo& info) : fInfo(info) {}
662c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman    GrBackend getBackend() const override { return kVulkan_GrBackend; }
672c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman
682c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osmanprotected:
692c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman    GrBackendObject getBackendObject() const override {
702c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman        return reinterpret_cast<GrBackendObject>(&fInfo);
712c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman    }
72fe3b51636d4216c4ea6cb74ed0964c1d315ca487Brian Osman    void attachToContext(GrContext*) override {
73fe3b51636d4216c4ea6cb74ed0964c1d315ca487Brian Osman        // TODO: Implement this
74fe3b51636d4216c4ea6cb74ed0964c1d315ca487Brian Osman    }
752c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman
762c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman    GrVkImageInfo fInfo;
772c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman
782c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman    typedef GrExternalTextureData INHERITED;
792c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman};
802c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman
81b2df0c2702329be6380a943d548e7377a51d8565egdanielGR_STATIC_ASSERT(sizeof(GrBackendObject) >= sizeof(const GrVkImageInfo*));
82fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth
83fd359caf0cbdefd759d1c788d72faba3f65a6386jvanverth#endif
84