Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 1 | // |
| 2 | // Copyright 2016 The ANGLE Project Authors. All rights reserved. |
| 3 | // Use of this source code is governed by a BSD-style license that can be |
| 4 | // found in the LICENSE file. |
| 5 | // |
| 6 | // ImageVk.cpp: |
| 7 | // Implements the class methods for ImageVk. |
| 8 | // |
| 9 | |
| 10 | #include "libANGLE/renderer/vulkan/ImageVk.h" |
| 11 | |
| 12 | #include "common/debug.h" |
Jamie Madill | 666818e | 2018-11-14 09:54:33 -0500 | [diff] [blame] | 13 | #include "libANGLE/Context.h" |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame^] | 14 | #include "libANGLE/Display.h" |
Jamie Madill | 666818e | 2018-11-14 09:54:33 -0500 | [diff] [blame] | 15 | #include "libANGLE/renderer/vulkan/ContextVk.h" |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame^] | 16 | #include "libANGLE/renderer/vulkan/DisplayVk.h" |
| 17 | #include "libANGLE/renderer/vulkan/RenderbufferVk.h" |
| 18 | #include "libANGLE/renderer/vulkan/TextureVk.h" |
Jamie Madill | 666818e | 2018-11-14 09:54:33 -0500 | [diff] [blame] | 19 | #include "libANGLE/renderer/vulkan/vk_utils.h" |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 20 | |
| 21 | namespace rx |
| 22 | { |
| 23 | |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame^] | 24 | ImageVk::ImageVk(const egl::ImageState &state, const gl::Context *context) |
| 25 | : ImageImpl(state), mOwnsImage(false), mImage(nullptr), mContext(context) |
| 26 | {} |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 27 | |
Jamie Madill | b980c56 | 2018-11-27 11:34:27 -0500 | [diff] [blame] | 28 | ImageVk::~ImageVk() {} |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 29 | |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame^] | 30 | void ImageVk::onDestroy(const egl::Display *display) |
| 31 | { |
| 32 | DisplayVk *displayVk = vk::GetImpl(display); |
| 33 | RendererVk *renderer = displayVk->getRenderer(); |
| 34 | |
| 35 | if (mImage != nullptr && mOwnsImage) |
| 36 | { |
| 37 | mImage->releaseImage(renderer); |
| 38 | mImage->releaseStagingBuffer(renderer); |
| 39 | delete mImage; |
| 40 | } |
| 41 | mImage = nullptr; |
| 42 | } |
| 43 | |
Geoff Lang | cd7cd2a | 2018-07-19 11:25:54 -0400 | [diff] [blame] | 44 | egl::Error ImageVk::initialize(const egl::Display *display) |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 45 | { |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame^] | 46 | |
| 47 | if (egl::IsTextureTarget(mState.target)) |
| 48 | { |
| 49 | TextureVk *textureVk = GetImplAs<TextureVk>(GetAs<gl::Texture>(mState.source)); |
| 50 | |
| 51 | // Make sure the texture has created its backing storage |
| 52 | ASSERT(mContext != nullptr); |
| 53 | ContextVk *contextVk = vk::GetImpl(mContext); |
| 54 | ANGLE_TRY(ResultToEGL(textureVk->ensureImageInitialized(contextVk))); |
| 55 | |
| 56 | mImage = &textureVk->getImage(); |
| 57 | |
| 58 | // The staging buffer for a texture source should already be initialized |
| 59 | |
| 60 | mOwnsImage = false; |
| 61 | |
| 62 | ASSERT(mState.imageIndex.getLevelIndex() == 0); |
| 63 | } |
| 64 | else if (egl::IsRenderbufferTarget(mState.target)) |
| 65 | { |
| 66 | RenderbufferVk *renderbufferVk = |
| 67 | GetImplAs<RenderbufferVk>(GetAs<gl::Renderbuffer>(mState.source)); |
| 68 | mImage = renderbufferVk->getImage(); |
| 69 | |
| 70 | // Make sure a staging buffer is ready to use to upload data |
| 71 | ASSERT(mContext != nullptr); |
| 72 | ContextVk *contextVk = vk::GetImpl(mContext); |
| 73 | RendererVk *renderer = contextVk->getRenderer(); |
| 74 | mImage->initStagingBuffer(renderer); |
| 75 | |
| 76 | mOwnsImage = false; |
| 77 | } |
| 78 | else |
| 79 | { |
| 80 | UNREACHABLE(); |
| 81 | return egl::EglBadAccess(); |
| 82 | } |
| 83 | |
| 84 | return egl::NoError(); |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 85 | } |
| 86 | |
Jamie Madill | 666818e | 2018-11-14 09:54:33 -0500 | [diff] [blame] | 87 | angle::Result ImageVk::orphan(const gl::Context *context, egl::ImageSibling *sibling) |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 88 | { |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame^] | 89 | if (sibling == mState.source) |
| 90 | { |
| 91 | if (egl::IsTextureTarget(mState.target)) |
| 92 | { |
| 93 | TextureVk *textureVk = GetImplAs<TextureVk>(GetAs<gl::Texture>(mState.source)); |
| 94 | ASSERT(mImage == &textureVk->getImage()); |
| 95 | textureVk->releaseOwnershipOfImage(context); |
| 96 | mOwnsImage = true; |
| 97 | } |
| 98 | else if (egl::IsRenderbufferTarget(mState.target)) |
| 99 | { |
| 100 | RenderbufferVk *renderbufferVk = |
| 101 | GetImplAs<RenderbufferVk>(GetAs<gl::Renderbuffer>(mState.source)); |
| 102 | ASSERT(mImage == renderbufferVk->getImage()); |
| 103 | renderbufferVk->releaseOwnershipOfImage(context); |
| 104 | mOwnsImage = true; |
| 105 | } |
| 106 | else |
| 107 | { |
| 108 | ANGLE_VK_UNREACHABLE(vk::GetImpl(context)); |
| 109 | return angle::Result::Stop; |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | return angle::Result::Continue; |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 114 | } |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame^] | 115 | |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 116 | } // namespace rx |