Hash :
b16d69c3
Author :
Date :
2019-05-13T16:28:27
Vulkan: Add support for surface multisampling A multisample image is created for the surface if multisampling is enabled. Prior to present, this multisample image is resolved into the swapchain image. FramebufferVk::readPixelsImpl similarly has got the ability to resolve the region of interest into a temporary image prior to readback. Tests are added to render a point, line and a triangle on a 4x multisampled surface. Bug: angleproject:3204 Change-Id: I34aca502fa1918b5cbf000ff11521c350372e051 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1610188 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@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
//
// 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/vk_caps_utils.h"
#include "libANGLE/renderer/vulkan/xcb/WindowSurfaceVkXcb.h"
namespace rx
{
namespace
{
EGLint GetXcbVisualType(xcb_screen_t *screen)
{
// Visual type is the class member of xcb_visualtype_t whose id matches the root visual.
for (xcb_depth_iterator_t depth_iter = xcb_screen_allowed_depths_iterator(screen);
depth_iter.rem; xcb_depth_next(&depth_iter))
{
for (xcb_visualtype_iterator_t visual_iter = xcb_depth_visuals_iterator(depth_iter.data);
visual_iter.rem; xcb_visualtype_next(&visual_iter))
{
if (screen->root_visual == visual_iter.data->visual_id)
{
return visual_iter.data->_class;
}
}
}
return EGL_NONE;
}
} // namespace
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()
{
constexpr GLenum kColorFormats[] = {GL_BGRA8_EXT, GL_BGRX8_ANGLEX};
return egl_vk::GenerateConfigs(kColorFormats, egl_vk::kConfigDepthStencilFormats, this);
}
bool DisplayVkXcb::checkConfigSupport(egl::Config *config)
{
// TODO(geofflang): Test for native support and modify the config accordingly.
// http://anglebug.com/2692
// Find the screen the window was created on:
xcb_screen_iterator_t screenIterator = xcb_setup_roots_iterator(xcb_get_setup(mXcbConnection));
ASSERT(screenIterator.rem);
xcb_screen_t *screen = screenIterator.data;
ASSERT(screen);
// Visual id is root_visual of the screen
config->nativeVisualID = screen->root_visual;
config->nativeVisualType = GetXcbVisualType(screen);
return true;
}
const char *DisplayVkXcb::getWSIExtension() const
{
return VK_KHR_XCB_SURFACE_EXTENSION_NAME;
}
} // namespace rx