blob: a75a22fbdf233008354a41898a4f0590815c4453 [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// SurfaceVk.cpp:
7// Implements the class methods for SurfaceVk.
8//
9
10#include "libANGLE/renderer/vulkan/SurfaceVk.h"
11
12#include "common/debug.h"
Jamie Madillfe548342017-06-19 11:13:24 -040013#include "libANGLE/Context.h"
Jamie Madillc564c072017-06-01 12:45:42 -040014#include "libANGLE/Display.h"
Jamie Madill4d0bf552016-12-28 15:45:24 -050015#include "libANGLE/Surface.h"
16#include "libANGLE/renderer/vulkan/DisplayVk.h"
Jamie Madille09bd5d2016-11-29 16:20:35 -050017#include "libANGLE/renderer/vulkan/FramebufferVk.h"
18#include "libANGLE/renderer/vulkan/RendererVk.h"
Jamie Madill3c424b42018-01-19 12:35:09 -050019#include "libANGLE/renderer/vulkan/vk_format_utils.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040020
21namespace rx
22{
23
Jamie Madill4d0bf552016-12-28 15:45:24 -050024namespace
25{
26
Jamie Madillf0eafe12017-02-21 15:03:50 -050027VkPresentModeKHR GetDesiredPresentMode(const std::vector<VkPresentModeKHR> &presentModes,
28 EGLint minSwapInterval,
29 EGLint maxSwapInterval)
30{
31 ASSERT(!presentModes.empty());
32
33 // Use FIFO mode for v-sync, since it throttles you to the display rate. Mailbox is more
Jamie Madilla9c60e92017-09-28 19:06:39 -040034 // similar to triple-buffering. For now we hard-code Mailbox for perf testing.
Jamie Madillf0eafe12017-02-21 15:03:50 -050035 // TODO(jmadill): Properly select present mode and re-create display if changed.
36 VkPresentModeKHR bestChoice = VK_PRESENT_MODE_MAILBOX_KHR;
37
Jamie Madillbc543422018-03-30 10:43:19 -040038 for (VkPresentModeKHR presentMode : presentModes)
Jamie Madillf0eafe12017-02-21 15:03:50 -050039 {
40 if (presentMode == bestChoice)
41 {
42 return bestChoice;
43 }
44 }
45
Jamie Madill98de8262017-05-29 13:01:02 -040046 WARN() << "Present mode " << bestChoice << " not available. Falling back to "
47 << presentModes[0];
Jamie Madillf0eafe12017-02-21 15:03:50 -050048 return presentModes[0];
49}
50
Geoff Lang9e141642018-06-27 11:43:18 -040051constexpr VkImageUsageFlags kSurfaceVKImageUsageFlags =
52 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
53constexpr VkImageUsageFlags kSurfaceVKColorImageUsageFlags =
54 kSurfaceVKImageUsageFlags | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
55constexpr VkImageUsageFlags kSurfaceVKDepthStencilImageUsageFlags =
56 kSurfaceVKImageUsageFlags | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
57
Jamie Madill4d0bf552016-12-28 15:45:24 -050058} // namespace
59
Geoff Lang9e141642018-06-27 11:43:18 -040060OffscreenSurfaceVk::AttachmentImage::AttachmentImage(vk::CommandGraphResource *commandGraphResource)
61 : renderTarget(&image, &imageView, commandGraphResource)
62{
63}
64
65OffscreenSurfaceVk::AttachmentImage::~AttachmentImage() = default;
66
Jamie Madill21061022018-07-12 23:56:30 -040067angle::Result OffscreenSurfaceVk::AttachmentImage::initialize(DisplayVk *displayVk,
68 EGLint width,
69 EGLint height,
70 const vk::Format &vkFormat)
Geoff Lang9e141642018-06-27 11:43:18 -040071{
Geoff Lang38971fd2018-06-28 15:19:18 -040072 RendererVk *renderer = displayVk->getRenderer();
Geoff Lang9e141642018-06-27 11:43:18 -040073
74 const angle::Format &textureFormat = vkFormat.textureFormat();
75 bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
76 const VkImageUsageFlags usage = isDepthOrStencilFormat ? kSurfaceVKDepthStencilImageUsageFlags
77 : kSurfaceVKColorImageUsageFlags;
78
79 gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1);
Jamie Madill21061022018-07-12 23:56:30 -040080 ANGLE_TRY(image.init(displayVk, gl::TextureType::_2D, extents, vkFormat, 1, usage, 1));
Geoff Lang9e141642018-06-27 11:43:18 -040081
82 VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Jamie Madill21061022018-07-12 23:56:30 -040083 ANGLE_TRY(image.initMemory(displayVk, renderer->getMemoryProperties(), flags));
Geoff Lang9e141642018-06-27 11:43:18 -040084
85 VkImageAspectFlags aspect = vk::GetFormatAspectFlags(textureFormat);
86
Jamie Madill21061022018-07-12 23:56:30 -040087 ANGLE_TRY(image.initImageView(displayVk, gl::TextureType::_2D, aspect, gl::SwizzleState(),
Geoff Lang9e141642018-06-27 11:43:18 -040088 &imageView, 1));
89
Jamie Madill21061022018-07-12 23:56:30 -040090 return angle::Result::Continue();
Geoff Lang9e141642018-06-27 11:43:18 -040091}
92
93void OffscreenSurfaceVk::AttachmentImage::destroy(const egl::Display *display,
94 Serial storedQueueSerial)
95{
96 const DisplayVk *displayVk = vk::GetImpl(display);
97 RendererVk *renderer = displayVk->getRenderer();
98
99 image.release(renderer->getCurrentQueueSerial(), renderer);
100 renderer->releaseObject(storedQueueSerial, &imageView);
101}
102
Jamie Madille09bd5d2016-11-29 16:20:35 -0500103OffscreenSurfaceVk::OffscreenSurfaceVk(const egl::SurfaceState &surfaceState,
104 EGLint width,
105 EGLint height)
Geoff Lang9e141642018-06-27 11:43:18 -0400106 : SurfaceImpl(surfaceState),
107 mWidth(width),
108 mHeight(height),
109 mColorAttachment(this),
110 mDepthStencilAttachment(this)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400111{
112}
113
Jamie Madille09bd5d2016-11-29 16:20:35 -0500114OffscreenSurfaceVk::~OffscreenSurfaceVk()
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400115{
116}
117
Jamie Madillc564c072017-06-01 12:45:42 -0400118egl::Error OffscreenSurfaceVk::initialize(const egl::Display *display)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400119{
Jamie Madill21061022018-07-12 23:56:30 -0400120 DisplayVk *displayVk = vk::GetImpl(display);
121 angle::Result result = initializeImpl(displayVk);
122 return angle::ToEGL(result, displayVk, EGL_BAD_SURFACE);
123}
Geoff Lang9e141642018-06-27 11:43:18 -0400124
Jamie Madill21061022018-07-12 23:56:30 -0400125angle::Result OffscreenSurfaceVk::initializeImpl(DisplayVk *displayVk)
126{
127 RendererVk *renderer = displayVk->getRenderer();
Geoff Lang9e141642018-06-27 11:43:18 -0400128 const egl::Config *config = mState.config;
129
130 if (config->renderTargetFormat != GL_NONE)
131 {
Jamie Madill21061022018-07-12 23:56:30 -0400132 ANGLE_TRY(mColorAttachment.initialize(displayVk, mWidth, mHeight,
Geoff Lang9e141642018-06-27 11:43:18 -0400133 renderer->getFormat(config->renderTargetFormat)));
134 }
135
136 if (config->depthStencilFormat != GL_NONE)
137 {
138 ANGLE_TRY(mDepthStencilAttachment.initialize(
Jamie Madill21061022018-07-12 23:56:30 -0400139 displayVk, mWidth, mHeight, renderer->getFormat(config->depthStencilFormat)));
Geoff Lang9e141642018-06-27 11:43:18 -0400140 }
141
Jamie Madill21061022018-07-12 23:56:30 -0400142 return angle::Result::Continue();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400143}
144
Geoff Lang9e141642018-06-27 11:43:18 -0400145void OffscreenSurfaceVk::destroy(const egl::Display *display)
146{
147 mColorAttachment.destroy(display, getStoredQueueSerial());
148 mDepthStencilAttachment.destroy(display, getStoredQueueSerial());
149}
150
Geoff Langbf7b95d2018-05-01 16:48:21 -0400151FramebufferImpl *OffscreenSurfaceVk::createDefaultFramebuffer(const gl::Context *context,
152 const gl::FramebufferState &state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400153{
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500154 // Use a user FBO for an offscreen RT.
155 return FramebufferVk::CreateUserFBO(state);
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400156}
157
Jamie Madillfe548342017-06-19 11:13:24 -0400158egl::Error OffscreenSurfaceVk::swap(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400159{
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500160 return egl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400161}
162
Jamie Madillfe548342017-06-19 11:13:24 -0400163egl::Error OffscreenSurfaceVk::postSubBuffer(const gl::Context * /*context*/,
164 EGLint /*x*/,
Jamie Madille09bd5d2016-11-29 16:20:35 -0500165 EGLint /*y*/,
166 EGLint /*width*/,
167 EGLint /*height*/)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400168{
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500169 return egl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400170}
171
Jamie Madille09bd5d2016-11-29 16:20:35 -0500172egl::Error OffscreenSurfaceVk::querySurfacePointerANGLE(EGLint /*attribute*/, void ** /*value*/)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400173{
Jamie Madille09bd5d2016-11-29 16:20:35 -0500174 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500175 return egl::EglBadCurrentSurface();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400176}
177
Geoff Langccafa622018-05-02 13:07:53 -0400178egl::Error OffscreenSurfaceVk::bindTexImage(const gl::Context * /*context*/,
179 gl::Texture * /*texture*/,
180 EGLint /*buffer*/)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400181{
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500182 return egl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400183}
184
Geoff Langccafa622018-05-02 13:07:53 -0400185egl::Error OffscreenSurfaceVk::releaseTexImage(const gl::Context * /*context*/, EGLint /*buffer*/)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400186{
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500187 return egl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400188}
189
Stanislav Chiknavaryanee218f22017-03-22 15:39:13 -0700190egl::Error OffscreenSurfaceVk::getSyncValues(EGLuint64KHR * /*ust*/,
191 EGLuint64KHR * /*msc*/,
192 EGLuint64KHR * /*sbc*/)
193{
194 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500195 return egl::EglBadAccess();
Stanislav Chiknavaryanee218f22017-03-22 15:39:13 -0700196}
197
Jamie Madille09bd5d2016-11-29 16:20:35 -0500198void OffscreenSurfaceVk::setSwapInterval(EGLint /*interval*/)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400199{
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400200}
201
Jamie Madille09bd5d2016-11-29 16:20:35 -0500202EGLint OffscreenSurfaceVk::getWidth() const
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400203{
Jamie Madille09bd5d2016-11-29 16:20:35 -0500204 return mWidth;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400205}
206
Jamie Madille09bd5d2016-11-29 16:20:35 -0500207EGLint OffscreenSurfaceVk::getHeight() const
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400208{
Jamie Madille09bd5d2016-11-29 16:20:35 -0500209 return mHeight;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400210}
211
Jamie Madille09bd5d2016-11-29 16:20:35 -0500212EGLint OffscreenSurfaceVk::isPostSubBufferSupported() const
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400213{
Jamie Madille09bd5d2016-11-29 16:20:35 -0500214 return EGL_FALSE;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400215}
216
Jamie Madille09bd5d2016-11-29 16:20:35 -0500217EGLint OffscreenSurfaceVk::getSwapBehavior() const
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400218{
Jamie Madille09bd5d2016-11-29 16:20:35 -0500219 return EGL_BUFFER_PRESERVED;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400220}
221
Geoff Lang9e141642018-06-27 11:43:18 -0400222gl::Error OffscreenSurfaceVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
223 GLenum binding,
224 const gl::ImageIndex & /*imageIndex*/,
225 FramebufferAttachmentRenderTarget **rtOut)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400226{
Geoff Lang9e141642018-06-27 11:43:18 -0400227 if (binding == GL_BACK)
228 {
229 *rtOut = &mColorAttachment.renderTarget;
230 }
231 else
232 {
233 ASSERT(binding == GL_DEPTH || binding == GL_STENCIL || binding == GL_DEPTH_STENCIL);
234 *rtOut = &mDepthStencilAttachment.renderTarget;
235 }
236
237 return gl::NoError();
Jamie Madille09bd5d2016-11-29 16:20:35 -0500238}
239
Jamie Madill05b35b22017-10-03 09:01:44 -0400240gl::Error OffscreenSurfaceVk::initializeContents(const gl::Context *context,
241 const gl::ImageIndex &imageIndex)
242{
243 UNIMPLEMENTED();
244 return gl::NoError();
245}
246
Jamie Madillbc543422018-03-30 10:43:19 -0400247WindowSurfaceVk::SwapchainImage::SwapchainImage() = default;
248WindowSurfaceVk::SwapchainImage::~SwapchainImage() = default;
249
250WindowSurfaceVk::SwapchainImage::SwapchainImage(SwapchainImage &&other)
251 : image(std::move(other.image)),
252 imageView(std::move(other.imageView)),
253 framebuffer(std::move(other.framebuffer)),
254 imageAcquiredSemaphore(std::move(other.imageAcquiredSemaphore)),
255 commandsCompleteSemaphore(std::move(other.commandsCompleteSemaphore))
256{
257}
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500258
Jamie Madill4d0bf552016-12-28 15:45:24 -0500259WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState,
260 EGLNativeWindowType window,
261 EGLint width,
262 EGLint height)
263 : SurfaceImpl(surfaceState),
264 mNativeWindowType(window),
Jamie Madill4d0bf552016-12-28 15:45:24 -0500265 mSurface(VK_NULL_HANDLE),
Frank Henigman29f148b2016-11-23 21:05:36 -0500266 mInstance(VK_NULL_HANDLE),
Jamie Madill4d0bf552016-12-28 15:45:24 -0500267 mSwapchain(VK_NULL_HANDLE),
Jamie Madillbcf467f2018-05-23 09:46:00 -0400268 mColorRenderTarget(nullptr, nullptr, this),
269 mDepthStencilRenderTarget(&mDepthStencilImage, &mDepthStencilImageView, this),
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500270 mCurrentSwapchainImageIndex(0)
Jamie Madille09bd5d2016-11-29 16:20:35 -0500271{
272}
273
274WindowSurfaceVk::~WindowSurfaceVk()
275{
Jamie Madill70ee0f62017-02-06 16:04:20 -0500276 ASSERT(mSurface == VK_NULL_HANDLE);
277 ASSERT(mSwapchain == VK_NULL_HANDLE);
Jamie Madill70ee0f62017-02-06 16:04:20 -0500278}
279
Jamie Madillc564c072017-06-01 12:45:42 -0400280void WindowSurfaceVk::destroy(const egl::Display *display)
Jamie Madill70ee0f62017-02-06 16:04:20 -0500281{
Geoff Lang38971fd2018-06-28 15:19:18 -0400282 DisplayVk *displayVk = vk::GetImpl(display);
283 RendererVk *renderer = displayVk->getRenderer();
284 VkDevice device = renderer->getDevice();
285 VkInstance instance = renderer->getInstance();
Jamie Madill70ee0f62017-02-06 16:04:20 -0500286
Jamie Madillf618c9e2018-02-15 14:45:40 -0500287 // We might not need to flush the pipe here.
Jamie Madill21061022018-07-12 23:56:30 -0400288 (void)renderer->finish(displayVk);
Jamie Madille918de22017-04-12 10:21:11 -0400289
Jamie Madilla9c60e92017-09-28 19:06:39 -0400290 mAcquireNextImageSemaphore.destroy(device);
Jamie Madill5deea722017-02-16 10:44:46 -0500291
Jamie Madillbc543422018-03-30 10:43:19 -0400292 mDepthStencilImage.release(renderer->getCurrentQueueSerial(), renderer);
293 mDepthStencilImageView.destroy(device);
Jamie Madillf618c9e2018-02-15 14:45:40 -0500294
Jamie Madillbc543422018-03-30 10:43:19 -0400295 for (SwapchainImage &swapchainImage : mSwapchainImages)
Jamie Madill70ee0f62017-02-06 16:04:20 -0500296 {
Jamie Madilla9c60e92017-09-28 19:06:39 -0400297 // Although we don't own the swapchain image handles, we need to keep our shutdown clean.
Jamie Madill858c1cc2018-03-31 14:19:13 -0400298 swapchainImage.image.resetImageWeakReference();
Jamie Madillbc543422018-03-30 10:43:19 -0400299 swapchainImage.image.destroy(device);
Jamie Madilla9c60e92017-09-28 19:06:39 -0400300 swapchainImage.imageView.destroy(device);
301 swapchainImage.framebuffer.destroy(device);
302 swapchainImage.imageAcquiredSemaphore.destroy(device);
303 swapchainImage.commandsCompleteSemaphore.destroy(device);
Jamie Madill5deea722017-02-16 10:44:46 -0500304 }
Jamie Madill4d0bf552016-12-28 15:45:24 -0500305
306 if (mSwapchain)
307 {
Jamie Madill70ee0f62017-02-06 16:04:20 -0500308 vkDestroySwapchainKHR(device, mSwapchain, nullptr);
Jamie Madill4d0bf552016-12-28 15:45:24 -0500309 mSwapchain = VK_NULL_HANDLE;
310 }
311
312 if (mSurface)
313 {
Jamie Madill70ee0f62017-02-06 16:04:20 -0500314 vkDestroySurfaceKHR(instance, mSurface, nullptr);
Jamie Madill4d0bf552016-12-28 15:45:24 -0500315 mSurface = VK_NULL_HANDLE;
316 }
Jamie Madille09bd5d2016-11-29 16:20:35 -0500317}
318
Jamie Madillc564c072017-06-01 12:45:42 -0400319egl::Error WindowSurfaceVk::initialize(const egl::Display *display)
Jamie Madille09bd5d2016-11-29 16:20:35 -0500320{
Jamie Madill21061022018-07-12 23:56:30 -0400321 DisplayVk *displayVk = vk::GetImpl(display);
322 angle::Result result = initializeImpl(displayVk);
323 return angle::ToEGL(result, displayVk, EGL_BAD_SURFACE);
Jamie Madill4d0bf552016-12-28 15:45:24 -0500324}
325
Jamie Madill21061022018-07-12 23:56:30 -0400326angle::Result WindowSurfaceVk::initializeImpl(DisplayVk *displayVk)
Jamie Madill4d0bf552016-12-28 15:45:24 -0500327{
Jamie Madill21061022018-07-12 23:56:30 -0400328 RendererVk *renderer = displayVk->getRenderer();
329
Frank Henigman29f148b2016-11-23 21:05:36 -0500330 gl::Extents windowSize;
Jamie Madill21061022018-07-12 23:56:30 -0400331 ANGLE_TRY(createSurfaceVk(displayVk, &windowSize));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500332
333 uint32_t presentQueue = 0;
Jamie Madill21061022018-07-12 23:56:30 -0400334 ANGLE_TRY(renderer->selectPresentQueueForSurface(displayVk, mSurface, &presentQueue));
Jamie Madillc6dbc252018-04-30 19:07:56 -0400335 ANGLE_UNUSED_VARIABLE(presentQueue);
Jamie Madill4d0bf552016-12-28 15:45:24 -0500336
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500337 const VkPhysicalDevice &physicalDevice = renderer->getPhysicalDevice();
Jamie Madill4d0bf552016-12-28 15:45:24 -0500338
339 VkSurfaceCapabilitiesKHR surfaceCaps;
Jamie Madill21061022018-07-12 23:56:30 -0400340 ANGLE_VK_TRY(displayVk,
341 vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, mSurface, &surfaceCaps));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500342
343 // Adjust width and height to the swapchain if necessary.
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500344 uint32_t width = surfaceCaps.currentExtent.width;
345 uint32_t height = surfaceCaps.currentExtent.height;
346
347 // TODO(jmadill): Support devices which don't support copy. We use this for ReadPixels.
Jamie Madill21061022018-07-12 23:56:30 -0400348 ANGLE_VK_CHECK(displayVk,
349 (surfaceCaps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) != 0,
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500350 VK_ERROR_INITIALIZATION_FAILED);
351
Jamie Madillbc543422018-03-30 10:43:19 -0400352 EGLAttrib attribWidth = mState.attributes.get(EGL_WIDTH, 0);
353 EGLAttrib attribHeight = mState.attributes.get(EGL_HEIGHT, 0);
354
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500355 if (surfaceCaps.currentExtent.width == 0xFFFFFFFFu)
Jamie Madill4d0bf552016-12-28 15:45:24 -0500356 {
357 ASSERT(surfaceCaps.currentExtent.height == 0xFFFFFFFFu);
358
Jamie Madillbc543422018-03-30 10:43:19 -0400359 if (attribWidth == 0)
Jamie Madill4d0bf552016-12-28 15:45:24 -0500360 {
Frank Henigman29f148b2016-11-23 21:05:36 -0500361 width = windowSize.width;
Jamie Madill4d0bf552016-12-28 15:45:24 -0500362 }
Jamie Madillbc543422018-03-30 10:43:19 -0400363 if (attribHeight == 0)
Jamie Madill4d0bf552016-12-28 15:45:24 -0500364 {
Frank Henigman29f148b2016-11-23 21:05:36 -0500365 height = windowSize.height;
Jamie Madill4d0bf552016-12-28 15:45:24 -0500366 }
367 }
368
Jamie Madillbc543422018-03-30 10:43:19 -0400369 gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1);
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500370
Jamie Madill4d0bf552016-12-28 15:45:24 -0500371 uint32_t presentModeCount = 0;
Jamie Madill21061022018-07-12 23:56:30 -0400372 ANGLE_VK_TRY(displayVk, vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, mSurface,
373 &presentModeCount, nullptr));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500374 ASSERT(presentModeCount > 0);
375
376 std::vector<VkPresentModeKHR> presentModes(presentModeCount);
Jamie Madill21061022018-07-12 23:56:30 -0400377 ANGLE_VK_TRY(displayVk, vkGetPhysicalDeviceSurfacePresentModesKHR(
378 physicalDevice, mSurface, &presentModeCount, presentModes.data()));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500379
Jamie Madillf0eafe12017-02-21 15:03:50 -0500380 // Select appropriate present mode based on vsync parameter.
381 // TODO(jmadill): More complete implementation, which allows for changing and more values.
382 const EGLint minSwapInterval = mState.config->minSwapInterval;
383 const EGLint maxSwapInterval = mState.config->maxSwapInterval;
384 ASSERT(minSwapInterval == 0 || minSwapInterval == 1);
385 ASSERT(maxSwapInterval == 0 || maxSwapInterval == 1);
Jamie Madill4d0bf552016-12-28 15:45:24 -0500386
Jamie Madillf0eafe12017-02-21 15:03:50 -0500387 VkPresentModeKHR swapchainPresentMode =
388 GetDesiredPresentMode(presentModes, minSwapInterval, maxSwapInterval);
Jamie Madill4d0bf552016-12-28 15:45:24 -0500389
390 // Determine number of swapchain images. Aim for one more than the minimum.
391 uint32_t minImageCount = surfaceCaps.minImageCount + 1;
392 if (surfaceCaps.maxImageCount > 0 && minImageCount > surfaceCaps.maxImageCount)
393 {
394 minImageCount = surfaceCaps.maxImageCount;
395 }
396
397 // Default to identity transform.
398 VkSurfaceTransformFlagBitsKHR preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
399 if ((surfaceCaps.supportedTransforms & preTransform) == 0)
400 {
401 preTransform = surfaceCaps.currentTransform;
402 }
403
Jamie Madill4d0bf552016-12-28 15:45:24 -0500404 uint32_t surfaceFormatCount = 0;
Jamie Madill21061022018-07-12 23:56:30 -0400405 ANGLE_VK_TRY(displayVk, vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, mSurface,
406 &surfaceFormatCount, nullptr));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500407
408 std::vector<VkSurfaceFormatKHR> surfaceFormats(surfaceFormatCount);
Jamie Madill21061022018-07-12 23:56:30 -0400409 ANGLE_VK_TRY(displayVk,
410 vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, mSurface, &surfaceFormatCount,
Jamie Madill4d0bf552016-12-28 15:45:24 -0500411 surfaceFormats.data()));
412
Jamie Madillbc543422018-03-30 10:43:19 -0400413 const vk::Format &format = renderer->getFormat(mState.config->renderTargetFormat);
414 VkFormat nativeFormat = format.vkTextureFormat;
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500415
Jamie Madill4d0bf552016-12-28 15:45:24 -0500416 if (surfaceFormatCount == 1u && surfaceFormats[0].format == VK_FORMAT_UNDEFINED)
417 {
418 // This is fine.
419 }
420 else
421 {
422 bool foundFormat = false;
Jamie Madillbc543422018-03-30 10:43:19 -0400423 for (const VkSurfaceFormatKHR &surfaceFormat : surfaceFormats)
Jamie Madill4d0bf552016-12-28 15:45:24 -0500424 {
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500425 if (surfaceFormat.format == nativeFormat)
Jamie Madill4d0bf552016-12-28 15:45:24 -0500426 {
427 foundFormat = true;
428 break;
429 }
430 }
431
Jamie Madill21061022018-07-12 23:56:30 -0400432 ANGLE_VK_CHECK(displayVk, foundFormat, VK_ERROR_INITIALIZATION_FAILED);
Jamie Madill4d0bf552016-12-28 15:45:24 -0500433 }
434
Yuly Novikov12da5e72018-01-23 18:34:53 -0500435 VkCompositeAlphaFlagBitsKHR compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
436 if ((surfaceCaps.supportedCompositeAlpha & compositeAlpha) == 0)
437 {
438 compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
439 }
Jamie Madill21061022018-07-12 23:56:30 -0400440 ANGLE_VK_CHECK(displayVk, (surfaceCaps.supportedCompositeAlpha & compositeAlpha) != 0,
Yuly Novikov12da5e72018-01-23 18:34:53 -0500441 VK_ERROR_INITIALIZATION_FAILED);
442
Jamie Madillf618c9e2018-02-15 14:45:40 -0500443 // We need transfer src for reading back from the backbuffer.
Geoff Lang9e141642018-06-27 11:43:18 -0400444 VkImageUsageFlags imageUsageFlags = kSurfaceVKColorImageUsageFlags;
Jamie Madillf618c9e2018-02-15 14:45:40 -0500445
Jamie Madill4d0bf552016-12-28 15:45:24 -0500446 VkSwapchainCreateInfoKHR swapchainInfo;
Jamie Madillf618c9e2018-02-15 14:45:40 -0500447 swapchainInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
448 swapchainInfo.pNext = nullptr;
449 swapchainInfo.flags = 0;
450 swapchainInfo.surface = mSurface;
451 swapchainInfo.minImageCount = minImageCount;
452 swapchainInfo.imageFormat = nativeFormat;
453 swapchainInfo.imageColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;
454 swapchainInfo.imageExtent.width = width;
455 swapchainInfo.imageExtent.height = height;
456 swapchainInfo.imageArrayLayers = 1;
457 swapchainInfo.imageUsage = imageUsageFlags;
Jamie Madill4d0bf552016-12-28 15:45:24 -0500458 swapchainInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
459 swapchainInfo.queueFamilyIndexCount = 0;
460 swapchainInfo.pQueueFamilyIndices = nullptr;
461 swapchainInfo.preTransform = preTransform;
Yuly Novikov12da5e72018-01-23 18:34:53 -0500462 swapchainInfo.compositeAlpha = compositeAlpha;
Jamie Madill4d0bf552016-12-28 15:45:24 -0500463 swapchainInfo.presentMode = swapchainPresentMode;
464 swapchainInfo.clipped = VK_TRUE;
465 swapchainInfo.oldSwapchain = VK_NULL_HANDLE;
466
Jamie Madill6a89d222017-11-02 11:59:51 -0400467 VkDevice device = renderer->getDevice();
Jamie Madill21061022018-07-12 23:56:30 -0400468 ANGLE_VK_TRY(displayVk, vkCreateSwapchainKHR(device, &swapchainInfo, nullptr, &mSwapchain));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500469
470 // Intialize the swapchain image views.
471 uint32_t imageCount = 0;
Jamie Madill21061022018-07-12 23:56:30 -0400472 ANGLE_VK_TRY(displayVk, vkGetSwapchainImagesKHR(device, mSwapchain, &imageCount, nullptr));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500473
474 std::vector<VkImage> swapchainImages(imageCount);
Jamie Madill21061022018-07-12 23:56:30 -0400475 ANGLE_VK_TRY(displayVk,
476 vkGetSwapchainImagesKHR(device, mSwapchain, &imageCount, swapchainImages.data()));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500477
Jamie Madill49ac74b2017-12-21 14:42:33 -0500478 // Allocate a command buffer for clearing our images to black.
479 vk::CommandBuffer *commandBuffer = nullptr;
Jamie Madill21061022018-07-12 23:56:30 -0400480 ANGLE_TRY(beginWriteResource(displayVk, &commandBuffer));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500481
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500482 VkClearColorValue transparentBlack;
483 transparentBlack.float32[0] = 0.0f;
484 transparentBlack.float32[1] = 0.0f;
485 transparentBlack.float32[2] = 0.0f;
486 transparentBlack.float32[3] = 0.0f;
487
Jamie Madill5deea722017-02-16 10:44:46 -0500488 mSwapchainImages.resize(imageCount);
Jamie Madilla9c60e92017-09-28 19:06:39 -0400489
Jamie Madill21061022018-07-12 23:56:30 -0400490 ANGLE_TRY(mAcquireNextImageSemaphore.init(displayVk));
Jamie Madill5deea722017-02-16 10:44:46 -0500491
492 for (uint32_t imageIndex = 0; imageIndex < imageCount; ++imageIndex)
Jamie Madill4d0bf552016-12-28 15:45:24 -0500493 {
Jamie Madillbc543422018-03-30 10:43:19 -0400494 SwapchainImage &member = mSwapchainImages[imageIndex];
495 member.image.init2DWeakReference(swapchainImages[imageIndex], extents, format, 1);
Jamie Madill21061022018-07-12 23:56:30 -0400496 ANGLE_TRY(member.image.initImageView(displayVk, gl::TextureType::_2D,
Jamie Madilleebe2192018-07-11 09:01:18 -0400497 VK_IMAGE_ASPECT_COLOR_BIT, gl::SwizzleState(),
498 &member.imageView, 1));
Jamie Madill25301b62017-10-28 20:59:31 -0400499
500 // Set transfer dest layout, and clear the image to black.
Luc Ferronc20b9502018-05-24 09:30:17 -0400501 member.image.clearColor(transparentBlack, 0, 1, commandBuffer);
Jamie Madill25301b62017-10-28 20:59:31 -0400502
Jamie Madill21061022018-07-12 23:56:30 -0400503 ANGLE_TRY(member.imageAcquiredSemaphore.init(displayVk));
504 ANGLE_TRY(member.commandsCompleteSemaphore.init(displayVk));
Jamie Madill4d0bf552016-12-28 15:45:24 -0500505 }
506
Jamie Madille918de22017-04-12 10:21:11 -0400507 // Get the first available swapchain iamge.
Jamie Madill21061022018-07-12 23:56:30 -0400508 ANGLE_TRY(nextSwapchainImage(displayVk));
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500509
Jamie Madillf618c9e2018-02-15 14:45:40 -0500510 // Initialize depth/stencil if requested.
511 if (mState.config->depthStencilFormat != GL_NONE)
512 {
513 const vk::Format &dsFormat = renderer->getFormat(mState.config->depthStencilFormat);
514
Geoff Lang9e141642018-06-27 11:43:18 -0400515 const VkImageUsageFlags dsUsage = kSurfaceVKDepthStencilImageUsageFlags;
Jamie Madillf618c9e2018-02-15 14:45:40 -0500516
Jamie Madill21061022018-07-12 23:56:30 -0400517 ANGLE_TRY(mDepthStencilImage.init(displayVk, gl::TextureType::_2D, extents, dsFormat, 1,
Geoff Lang9e141642018-06-27 11:43:18 -0400518 dsUsage, 1));
Jamie Madill21061022018-07-12 23:56:30 -0400519 ANGLE_TRY(mDepthStencilImage.initMemory(displayVk, renderer->getMemoryProperties(),
Jamie Madillbc543422018-03-30 10:43:19 -0400520 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
Jamie Madillf618c9e2018-02-15 14:45:40 -0500521
Luc Ferron5bdf8bd2018-06-20 09:51:37 -0400522 const VkImageAspectFlags aspect = vk::GetDepthStencilAspectFlags(dsFormat.textureFormat());
Jamie Madillf618c9e2018-02-15 14:45:40 -0500523 VkClearDepthStencilValue depthStencilClearValue = {1.0f, 0};
524
525 // Set transfer dest layout, and clear the image.
Jamie Madill858c1cc2018-03-31 14:19:13 -0400526 mDepthStencilImage.clearDepthStencil(aspect, depthStencilClearValue, commandBuffer);
Jamie Madillf618c9e2018-02-15 14:45:40 -0500527
Jamie Madill21061022018-07-12 23:56:30 -0400528 ANGLE_TRY(mDepthStencilImage.initImageView(displayVk, gl::TextureType::_2D, aspect,
Luc Ferron66410532018-04-20 12:47:45 -0400529 gl::SwizzleState(), &mDepthStencilImageView, 1));
Jamie Madillf618c9e2018-02-15 14:45:40 -0500530
Jamie Madillf618c9e2018-02-15 14:45:40 -0500531 // TODO(jmadill): Figure out how to pass depth/stencil image views to the RenderTargetVk.
532 }
533
Jamie Madill21061022018-07-12 23:56:30 -0400534 return angle::Result::Continue();
Jamie Madille09bd5d2016-11-29 16:20:35 -0500535}
536
Geoff Langbf7b95d2018-05-01 16:48:21 -0400537FramebufferImpl *WindowSurfaceVk::createDefaultFramebuffer(const gl::Context *context,
538 const gl::FramebufferState &state)
Jamie Madille09bd5d2016-11-29 16:20:35 -0500539{
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500540 return FramebufferVk::CreateDefaultFBO(state, this);
Jamie Madille09bd5d2016-11-29 16:20:35 -0500541}
542
Jamie Madillfe548342017-06-19 11:13:24 -0400543egl::Error WindowSurfaceVk::swap(const gl::Context *context)
Jamie Madille09bd5d2016-11-29 16:20:35 -0500544{
Jamie Madill21061022018-07-12 23:56:30 -0400545 DisplayVk *displayVk = vk::GetImpl(context->getCurrentDisplay());
546 angle::Result result = swapImpl(displayVk);
547 return angle::ToEGL(result, displayVk, EGL_BAD_SURFACE);
548}
549
550angle::Result WindowSurfaceVk::swapImpl(DisplayVk *displayVk)
551{
552 RendererVk *renderer = displayVk->getRenderer();
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500553
Jamie Madill49ac74b2017-12-21 14:42:33 -0500554 vk::CommandBuffer *swapCommands = nullptr;
Jamie Madill21061022018-07-12 23:56:30 -0400555 ANGLE_TRY(beginWriteResource(displayVk, &swapCommands));
Jamie Madilld4826152017-09-21 11:18:59 -0400556
Jamie Madillbc543422018-03-30 10:43:19 -0400557 SwapchainImage &image = mSwapchainImages[mCurrentSwapchainImageIndex];
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500558
Jamie Madill858c1cc2018-03-31 14:19:13 -0400559 image.image.changeLayoutWithStages(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
560 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
561 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, swapCommands);
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500562
Jamie Madill49ac74b2017-12-21 14:42:33 -0500563 ANGLE_TRY(
Jamie Madill21061022018-07-12 23:56:30 -0400564 renderer->flush(displayVk, image.imageAcquiredSemaphore, image.commandsCompleteSemaphore));
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500565
566 VkPresentInfoKHR presentInfo;
567 presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
568 presentInfo.pNext = nullptr;
Jamie Madille918de22017-04-12 10:21:11 -0400569 presentInfo.waitSemaphoreCount = 1;
Jamie Madilla9c60e92017-09-28 19:06:39 -0400570 presentInfo.pWaitSemaphores = image.commandsCompleteSemaphore.ptr();
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500571 presentInfo.swapchainCount = 1;
572 presentInfo.pSwapchains = &mSwapchain;
573 presentInfo.pImageIndices = &mCurrentSwapchainImageIndex;
574 presentInfo.pResults = nullptr;
575
Jamie Madill21061022018-07-12 23:56:30 -0400576 ANGLE_VK_TRY(displayVk, vkQueuePresentKHR(renderer->getQueue(), &presentInfo));
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500577
Jamie Madillf0eafe12017-02-21 15:03:50 -0500578 // Get the next available swapchain image.
Jamie Madill21061022018-07-12 23:56:30 -0400579 ANGLE_TRY(nextSwapchainImage(displayVk));
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500580
Jamie Madill21061022018-07-12 23:56:30 -0400581 return angle::Result::Continue();
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500582}
583
Jamie Madill21061022018-07-12 23:56:30 -0400584angle::Result WindowSurfaceVk::nextSwapchainImage(DisplayVk *displayVk)
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500585{
Jamie Madill21061022018-07-12 23:56:30 -0400586 VkDevice device = displayVk->getDevice();
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500587
Jamie Madill21061022018-07-12 23:56:30 -0400588 ANGLE_VK_TRY(displayVk, vkAcquireNextImageKHR(device, mSwapchain, UINT64_MAX,
589 mAcquireNextImageSemaphore.getHandle(),
590 VK_NULL_HANDLE, &mCurrentSwapchainImageIndex));
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500591
Jamie Madillbc543422018-03-30 10:43:19 -0400592 SwapchainImage &image = mSwapchainImages[mCurrentSwapchainImageIndex];
Jamie Madilla9c60e92017-09-28 19:06:39 -0400593
594 // Swap the unused swapchain semaphore and the now active spare semaphore.
595 std::swap(image.imageAcquiredSemaphore, mAcquireNextImageSemaphore);
596
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500597 // Update RenderTarget pointers.
Jamie Madillbcf467f2018-05-23 09:46:00 -0400598 mColorRenderTarget.updateSwapchainImage(&image.image, &image.imageView);
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500599
Jamie Madill21061022018-07-12 23:56:30 -0400600 return angle::Result::Continue();
Jamie Madille09bd5d2016-11-29 16:20:35 -0500601}
602
Jamie Madillfe548342017-06-19 11:13:24 -0400603egl::Error WindowSurfaceVk::postSubBuffer(const gl::Context *context,
604 EGLint x,
605 EGLint y,
606 EGLint width,
607 EGLint height)
Jamie Madille09bd5d2016-11-29 16:20:35 -0500608{
609 // TODO(jmadill)
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500610 return egl::NoError();
Jamie Madille09bd5d2016-11-29 16:20:35 -0500611}
612
613egl::Error WindowSurfaceVk::querySurfacePointerANGLE(EGLint attribute, void **value)
614{
615 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500616 return egl::EglBadCurrentSurface();
Jamie Madille09bd5d2016-11-29 16:20:35 -0500617}
618
Geoff Langccafa622018-05-02 13:07:53 -0400619egl::Error WindowSurfaceVk::bindTexImage(const gl::Context *context,
620 gl::Texture *texture,
621 EGLint buffer)
Jamie Madille09bd5d2016-11-29 16:20:35 -0500622{
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500623 return egl::NoError();
Jamie Madille09bd5d2016-11-29 16:20:35 -0500624}
625
Geoff Langccafa622018-05-02 13:07:53 -0400626egl::Error WindowSurfaceVk::releaseTexImage(const gl::Context *context, EGLint buffer)
Jamie Madille09bd5d2016-11-29 16:20:35 -0500627{
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500628 return egl::NoError();
Jamie Madille09bd5d2016-11-29 16:20:35 -0500629}
630
Stanislav Chiknavaryanee218f22017-03-22 15:39:13 -0700631egl::Error WindowSurfaceVk::getSyncValues(EGLuint64KHR * /*ust*/,
632 EGLuint64KHR * /*msc*/,
633 EGLuint64KHR * /*sbc*/)
634{
635 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500636 return egl::EglBadAccess();
Stanislav Chiknavaryanee218f22017-03-22 15:39:13 -0700637}
638
Jamie Madille09bd5d2016-11-29 16:20:35 -0500639void WindowSurfaceVk::setSwapInterval(EGLint interval)
640{
641}
642
643EGLint WindowSurfaceVk::getWidth() const
644{
Jamie Madillbcf467f2018-05-23 09:46:00 -0400645 return static_cast<EGLint>(mColorRenderTarget.getImageExtents().width);
Jamie Madille09bd5d2016-11-29 16:20:35 -0500646}
647
648EGLint WindowSurfaceVk::getHeight() const
649{
Jamie Madillbcf467f2018-05-23 09:46:00 -0400650 return static_cast<EGLint>(mColorRenderTarget.getImageExtents().height);
Jamie Madille09bd5d2016-11-29 16:20:35 -0500651}
652
653EGLint WindowSurfaceVk::isPostSubBufferSupported() const
654{
655 // TODO(jmadill)
656 return EGL_FALSE;
657}
658
659EGLint WindowSurfaceVk::getSwapBehavior() const
660{
661 // TODO(jmadill)
662 return EGL_BUFFER_DESTROYED;
663}
664
Jamie Madill4928b7c2017-06-20 12:57:39 -0400665gl::Error WindowSurfaceVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
Jamie Madillf618c9e2018-02-15 14:45:40 -0500666 GLenum binding,
Jamie Madill4fd95d52017-04-05 11:22:18 -0400667 const gl::ImageIndex & /*target*/,
668 FramebufferAttachmentRenderTarget **rtOut)
Jamie Madille09bd5d2016-11-29 16:20:35 -0500669{
Jamie Madillf618c9e2018-02-15 14:45:40 -0500670 if (binding == GL_BACK)
671 {
672 *rtOut = &mColorRenderTarget;
673 }
674 else
675 {
676 ASSERT(binding == GL_DEPTH || binding == GL_STENCIL || binding == GL_DEPTH_STENCIL);
677 *rtOut = &mDepthStencilRenderTarget;
678 }
679
Jamie Madill7b57b9d2017-01-13 09:33:38 -0500680 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400681}
682
Jamie Madill21061022018-07-12 23:56:30 -0400683angle::Result WindowSurfaceVk::getCurrentFramebuffer(vk::Context *context,
684 const vk::RenderPass &compatibleRenderPass,
685 vk::Framebuffer **framebufferOut)
Jamie Madillab9f9c32017-01-17 17:47:34 -0500686{
Jamie Madillbc543422018-03-30 10:43:19 -0400687 vk::Framebuffer &currentFramebuffer = mSwapchainImages[mCurrentSwapchainImageIndex].framebuffer;
Jamie Madilla9c60e92017-09-28 19:06:39 -0400688
689 if (currentFramebuffer.valid())
Jamie Madillab9f9c32017-01-17 17:47:34 -0500690 {
691 // Validation layers should detect if the render pass is really compatible.
Jamie Madill55981482018-07-11 09:01:18 -0400692 *framebufferOut = &currentFramebuffer;
Jamie Madill21061022018-07-12 23:56:30 -0400693 return angle::Result::Continue();
Jamie Madillab9f9c32017-01-17 17:47:34 -0500694 }
695
696 VkFramebufferCreateInfo framebufferInfo;
697
Jamie Madillbcf467f2018-05-23 09:46:00 -0400698 const gl::Extents &extents = mColorRenderTarget.getImageExtents();
Jamie Madillf618c9e2018-02-15 14:45:40 -0500699 std::array<VkImageView, 2> imageViews = {{VK_NULL_HANDLE, mDepthStencilImageView.getHandle()}};
700
Jamie Madillab9f9c32017-01-17 17:47:34 -0500701 framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
702 framebufferInfo.pNext = nullptr;
703 framebufferInfo.flags = 0;
704 framebufferInfo.renderPass = compatibleRenderPass.getHandle();
Jamie Madillbc543422018-03-30 10:43:19 -0400705 framebufferInfo.attachmentCount = (mDepthStencilImage.valid() ? 2u : 1u);
Jamie Madillf618c9e2018-02-15 14:45:40 -0500706 framebufferInfo.pAttachments = imageViews.data();
Jamie Madillbc543422018-03-30 10:43:19 -0400707 framebufferInfo.width = static_cast<uint32_t>(extents.width);
708 framebufferInfo.height = static_cast<uint32_t>(extents.height);
Jamie Madillab9f9c32017-01-17 17:47:34 -0500709 framebufferInfo.layers = 1;
710
Jamie Madillbc543422018-03-30 10:43:19 -0400711 for (SwapchainImage &swapchainImage : mSwapchainImages)
Jamie Madillab9f9c32017-01-17 17:47:34 -0500712 {
Jamie Madillf618c9e2018-02-15 14:45:40 -0500713 imageViews[0] = swapchainImage.imageView.getHandle();
Jamie Madill21061022018-07-12 23:56:30 -0400714 ANGLE_TRY(swapchainImage.framebuffer.init(context, framebufferInfo));
Jamie Madillab9f9c32017-01-17 17:47:34 -0500715 }
716
Jamie Madilla9c60e92017-09-28 19:06:39 -0400717 ASSERT(currentFramebuffer.valid());
Jamie Madill55981482018-07-11 09:01:18 -0400718 *framebufferOut = &currentFramebuffer;
Jamie Madill21061022018-07-12 23:56:30 -0400719 return angle::Result::Continue();
Jamie Madillab9f9c32017-01-17 17:47:34 -0500720}
721
Jamie Madill05b35b22017-10-03 09:01:44 -0400722gl::Error WindowSurfaceVk::initializeContents(const gl::Context *context,
723 const gl::ImageIndex &imageIndex)
724{
725 UNIMPLEMENTED();
726 return gl::NoError();
727}
728
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400729} // namespace rx