Hash :
f618c9e5
Author :
Date :
2018-02-15T14:45:40
Vulkan: Add depth/stencil surfaces. This change lets us create egl::Surfaces from a D24S8 config. This is a bit hacky, because the spec only mandates 24 -or- 32 bit depth support, but not both or either individually. Will need follow-up work for proper EGL config setup. A single depth buffer is allocated for the entire set of swapchain images and is used with each. This also might be a problem if we're rendering to multiple frames at the same time. We'll likely have to revisit this in the future as well. This adds a new RenderTargetVk to the SurfaceVk class which points to the Depth/Stencil image. Since ImageViews must refer to either the depth or stencil, but not both, we'll need to address this when we get to implementing depth/stencil texture reads in shaders. Bug: angleproject:2357 Change-Id: Ibed0eed7e1d0efb272758dbfc79fa2c5aa93997f Reviewed-on: https://chromium-review.googlesource.com/919761 Reviewed-by: Yuly Novikov <ynovikov@chromium.org> Commit-Queue: Jamie Madill <jmadill@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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
//
// Copyright 2016 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.
//
// DisplayVkXcb.cpp:
// Implements the class methods for DisplayVkXcb.
//
#include "libANGLE/renderer/vulkan/xcb/DisplayVkXcb.h"
#include <xcb/xcb.h>
#include "libANGLE/renderer/vulkan/xcb/WindowSurfaceVkXcb.h"
namespace rx
{
DisplayVkXcb::DisplayVkXcb(const egl::DisplayState &state)
: DisplayVk(state), mXcbConnection(nullptr)
{
}
egl::Error DisplayVkXcb::initialize(egl::Display *display)
{
mXcbConnection = xcb_connect(nullptr, nullptr);
if (mXcbConnection == nullptr)
{
return egl::EglNotInitialized();
}
return DisplayVk::initialize(display);
}
void DisplayVkXcb::terminate()
{
ASSERT(mXcbConnection != nullptr);
xcb_disconnect(mXcbConnection);
mXcbConnection = nullptr;
DisplayVk::terminate();
}
bool DisplayVkXcb::isValidNativeWindow(EGLNativeWindowType window) const
{
// There doesn't appear to be an xcb function explicitly for checking the validity of a
// window ID, but xcb_query_tree_reply will return nullptr if the window doesn't exist.
xcb_query_tree_cookie_t cookie = xcb_query_tree(mXcbConnection, window);
xcb_query_tree_reply_t *reply = xcb_query_tree_reply(mXcbConnection, cookie, nullptr);
if (reply)
{
free(reply);
return true;
}
return false;
}
SurfaceImpl *DisplayVkXcb::createWindowSurfaceVk(const egl::SurfaceState &state,
EGLNativeWindowType window,
EGLint width,
EGLint height)
{
return new WindowSurfaceVkXcb(state, window, width, height, mXcbConnection);
}
egl::ConfigSet DisplayVkXcb::generateConfigs()
{
// TODO(jmadill): Multiple configs, pbuffers, and proper checking of config attribs.
egl::Config bgra;
bgra.renderTargetFormat = GL_BGRA8_EXT;
bgra.depthStencilFormat = GL_NONE;
bgra.bufferSize = 32;
bgra.redSize = 8;
bgra.greenSize = 8;
bgra.blueSize = 8;
bgra.alphaSize = 8;
bgra.alphaMaskSize = 0;
bgra.bindToTextureRGB = EGL_FALSE;
bgra.bindToTextureRGBA = EGL_FALSE;
bgra.colorBufferType = EGL_RGB_BUFFER;
bgra.configCaveat = EGL_NONE;
bgra.conformant = 0;
bgra.depthSize = 0;
bgra.stencilSize = 0;
bgra.level = 0;
bgra.matchNativePixmap = EGL_NONE;
bgra.maxPBufferWidth = 0;
bgra.maxPBufferHeight = 0;
bgra.maxPBufferPixels = 0;
bgra.maxSwapInterval = 1;
bgra.minSwapInterval = 1;
bgra.nativeRenderable = EGL_TRUE;
bgra.nativeVisualID = 0;
bgra.nativeVisualType = EGL_NONE;
bgra.renderableType = EGL_OPENGL_ES2_BIT;
bgra.sampleBuffers = 0;
bgra.samples = 0;
bgra.surfaceType = EGL_WINDOW_BIT;
bgra.optimalOrientation = 0;
bgra.transparentType = EGL_NONE;
bgra.transparentRedValue = 0;
bgra.transparentGreenValue = 0;
bgra.transparentBlueValue = 0;
bgra.colorComponentType = EGL_COLOR_COMPONENT_TYPE_FIXED_EXT;
egl::Config bgraD24S8;
bgraD24S8 = bgra;
bgraD24S8.depthStencilFormat = GL_DEPTH24_STENCIL8;
bgraD24S8.depthSize = 24;
bgraD24S8.stencilSize = 8;
egl::ConfigSet configSet;
configSet.add(bgra);
configSet.add(bgraD24S8);
return configSet;
}
const char *DisplayVkXcb::getWSIName() const
{
return VK_KHR_XCB_SURFACE_EXTENSION_NAME;
}
} // namespace rx