blob: a8045479adc9663937c02db3ff6d854bef9fa3e0 [file] [log] [blame]
Jamie Madill9e54b5a2016-05-25 12:57:39 -04001//
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 Madill666818e2018-11-14 09:54:33 -050013#include "libANGLE/Context.h"
Geoff Langfe59f6b2019-01-16 09:34:30 -050014#include "libANGLE/Display.h"
Jamie Madill666818e2018-11-14 09:54:33 -050015#include "libANGLE/renderer/vulkan/ContextVk.h"
Geoff Langfe59f6b2019-01-16 09:34:30 -050016#include "libANGLE/renderer/vulkan/DisplayVk.h"
17#include "libANGLE/renderer/vulkan/RenderbufferVk.h"
18#include "libANGLE/renderer/vulkan/TextureVk.h"
Jamie Madill666818e2018-11-14 09:54:33 -050019#include "libANGLE/renderer/vulkan/vk_utils.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040020
21namespace rx
22{
23
Geoff Langfe59f6b2019-01-16 09:34:30 -050024ImageVk::ImageVk(const egl::ImageState &state, const gl::Context *context)
25 : ImageImpl(state), mOwnsImage(false), mImage(nullptr), mContext(context)
26{}
Jamie Madill9e54b5a2016-05-25 12:57:39 -040027
Jamie Madillb980c562018-11-27 11:34:27 -050028ImageVk::~ImageVk() {}
Jamie Madill9e54b5a2016-05-25 12:57:39 -040029
Geoff Langfe59f6b2019-01-16 09:34:30 -050030void 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 Langcd7cd2a2018-07-19 11:25:54 -040044egl::Error ImageVk::initialize(const egl::Display *display)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040045{
Geoff Langfe59f6b2019-01-16 09:34:30 -050046
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 Madill9e54b5a2016-05-25 12:57:39 -040085}
86
Jamie Madill666818e2018-11-14 09:54:33 -050087angle::Result ImageVk::orphan(const gl::Context *context, egl::ImageSibling *sibling)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040088{
Geoff Langfe59f6b2019-01-16 09:34:30 -050089 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 Madill9e54b5a2016-05-25 12:57:39 -0400114}
Geoff Langfe59f6b2019-01-16 09:34:30 -0500115
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400116} // namespace rx