Hash :
3ff24d6f
Author :
Date :
2020-05-10T18:16:55
Vulkan: Add dedicated allocation support to MemoryObjectVk Add a VkMemoryDedicatedAllocateInfo to the vkAllocateMemory pNext chain if the client specifies the memory object was a dedicated allocation. We don't yet support suballocation of external memory objects, so all allocations are already effectively dedicated allocations regardless of whether vulkan requires it. The spec requires that memory passed to vkBindImageMemory be created with a VkMemoryDedicatedAllocateInfo if the driver requires dedicated allocations for that VkImage. If the driver does not require a dedicated allocation, there actually seems to be no explicit requirement to use this structure even if it was passed in at allocation time. Bug: angleproject:4627 Change-Id: I8a660e871bdf72815815f0c0b3000f3b0570bd2d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2192501 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Michael Spang <spang@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// MemoryObjectVk.h: Defines the class interface for MemoryObjectVk,
// implementing MemoryObjectImpl.
#ifndef LIBANGLE_RENDERER_VULKAN_MEMORYOBJECTVK_H_
#define LIBANGLE_RENDERER_VULKAN_MEMORYOBJECTVK_H_
#include "libANGLE/renderer/MemoryObjectImpl.h"
#include "libANGLE/renderer/vulkan/vk_helpers.h"
#include "libANGLE/renderer/vulkan/vk_wrapper.h"
namespace rx
{
class MemoryObjectVk : public MemoryObjectImpl
{
public:
MemoryObjectVk();
~MemoryObjectVk() override;
void onDestroy(const gl::Context *context) override;
angle::Result setDedicatedMemory(const gl::Context *context, bool dedicatedMemory) override;
angle::Result importFd(gl::Context *context,
GLuint64 size,
gl::HandleType handleType,
GLint fd) override;
angle::Result importZirconHandle(gl::Context *context,
GLuint64 size,
gl::HandleType handleType,
GLuint handle) override;
angle::Result createImage(ContextVk *context,
gl::TextureType type,
size_t levels,
GLenum internalFormat,
const gl::Extents &size,
GLuint64 offset,
vk::ImageHelper *image);
private:
static constexpr int kInvalidFd = -1;
angle::Result importOpaqueFd(ContextVk *contextVk, GLuint64 size, GLint fd);
angle::Result importZirconVmo(ContextVk *contextVk, GLuint64 size, GLuint handle);
// Imported memory object was a dedicated allocation.
bool mDedicatedMemory = false;
GLuint64 mSize = 0;
gl::HandleType mHandleType = gl::HandleType::InvalidEnum;
int mFd = kInvalidFd;
zx_handle_t mZirconHandle = ZX_HANDLE_INVALID;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_MEMORYOBJECTVK_H_