Merge changes I97efd6c9,I6460f8f0,Ic67e4290,I16214514,Ieaa4e463, ... into nyc-dev
* changes:
vulkan: remove g_device_layers
vulkan: ignore device-only layers
vulkan: ignore layer libraries without instance layers
vulkan: add FindLayer helper
vulkan: constify LayerRef members
vulkan: make g_library_mutex per-LayerLibrary
vulkan: make LayerLibrary a class
vulkan: refactor GetLayerGetProcAddr
vulkan: refactor AddLayerLibrary
vulkan: refactor LayerRef::~LayerRef
vulkan: refactor GetLayerRef
vulkan: add a constructor for LayerLibrary
diff --git a/cmds/servicemanager/servicemanager.rc b/cmds/servicemanager/servicemanager.rc
index 1ba339d..aee7bd8 100644
--- a/cmds/servicemanager/servicemanager.rc
+++ b/cmds/servicemanager/servicemanager.rc
@@ -11,4 +11,5 @@
onrestart restart inputflinger
onrestart restart drm
onrestart restart cameraserver
+ writepid /dev/cpuset/system-background/tasks
diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp
index df639cd..217c821 100644
--- a/opengl/libs/EGL/eglApi.cpp
+++ b/opengl/libs/EGL/eglApi.cpp
@@ -605,7 +605,6 @@
EGLBoolean result = s->cnx->egl.eglDestroySurface(dp->disp.dpy, s->surface);
if (result == EGL_TRUE) {
_s.terminate();
- dp->removeSurface(surface);
}
return result;
}
diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp
index c368bad..e335a6c 100644
--- a/opengl/libs/EGL/egl_display.cpp
+++ b/opengl/libs/EGL/egl_display.cpp
@@ -90,31 +90,6 @@
return false;
}
-void egl_display_t::addContext(egl_context_t* context) {
- Mutex::Autolock _l(lock);
- contexts.add(context);
-}
-
-void egl_display_t::removeContext(egl_context_t* context) {
- Mutex::Autolock _l(lock);
- contexts.remove(context);
-}
-
-void egl_display_t::removeSurface(EGLSurface surface) const {
- Mutex::Autolock _l(lock);
- for (size_t i = 0; i < contexts.size(); i++) {
- egl_context_t* context = contexts[i];
- if (context->read == surface) {
- SurfaceRef _r(get_surface(context->read));
- _r.release();
- }
- if (context->draw == surface) {
- SurfaceRef _d(get_surface(context->draw));
- _d.release();
- }
- }
-}
-
EGLDisplay egl_display_t::getFromNativeDisplay(EGLNativeDisplayType disp) {
if (uintptr_t(disp) >= NUM_DISPLAYS)
return NULL;
diff --git a/opengl/libs/EGL/egl_display.h b/opengl/libs/EGL/egl_display.h
index 0ede705..2d86295 100644
--- a/opengl/libs/EGL/egl_display.h
+++ b/opengl/libs/EGL/egl_display.h
@@ -68,13 +68,6 @@
// add reference to this object. returns true if this is a valid object.
bool getObject(egl_object_t* object) const;
- // add context to this display's list
- void addContext(egl_context_t* context);
- // remove context from this display's list
- void removeContext(egl_context_t* context);
- // search for surface on all contexts and remove the references
- void removeSurface(EGLSurface surface) const;
-
// These notifications allow the display to keep track of how many window
// surfaces exist, which it uses to decide whether to hibernate the
// underlying EGL implementation. They can be called by any thread without
@@ -142,7 +135,6 @@
mutable Mutex lock, refLock;
mutable Condition refCond;
SortedVector<egl_object_t*> objects;
- SortedVector<egl_context_t*> contexts;
String8 mVendorString;
String8 mVersionString;
String8 mClientApiString;
diff --git a/opengl/libs/EGL/egl_object.cpp b/opengl/libs/EGL/egl_object.cpp
index 8859387..918faa8 100644
--- a/opengl/libs/EGL/egl_object.cpp
+++ b/opengl/libs/EGL/egl_object.cpp
@@ -91,12 +91,6 @@
egl_connection_t const* cnx, int version) :
egl_object_t(get_display_nowake(dpy)), dpy(dpy), context(context),
config(config), read(0), draw(0), cnx(cnx), version(version) {
- get_display_nowake(dpy)->addContext(this);
-}
-
-void egl_context_t::terminate() {
- display->removeContext(this);
- egl_object_t::terminate();
}
void egl_context_t::onLooseCurrent() {
diff --git a/opengl/libs/EGL/egl_object.h b/opengl/libs/EGL/egl_object.h
index 8268900..17a8304 100644
--- a/opengl/libs/EGL/egl_object.h
+++ b/opengl/libs/EGL/egl_object.h
@@ -40,12 +40,11 @@
class egl_display_t;
class egl_object_t {
+ egl_display_t *display;
mutable volatile int32_t count;
protected:
virtual ~egl_object_t();
- virtual void terminate();
- egl_display_t *display;
public:
egl_object_t(egl_display_t* display);
@@ -56,6 +55,7 @@
inline egl_display_t* getDisplay() const { return display; }
private:
+ void terminate();
static bool get(egl_display_t const* display, egl_object_t* object);
public:
@@ -143,7 +143,6 @@
class egl_context_t: public egl_object_t {
protected:
~egl_context_t() {}
- void terminate() override;
public:
typedef egl_object_t::LocalRef<egl_context_t, EGLContext> Ref;
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp
index 17ccc72..b02f5b4 100644
--- a/vulkan/libvulkan/driver.cpp
+++ b/vulkan/libvulkan/driver.cpp
@@ -480,17 +480,20 @@
if (hook->type == ProcHook::GLOBAL)
return hook->proc;
+ // v0 layers expect
+ //
+ // vkGetInstanceProcAddr(VK_NULL_HANDLE, "vkCreateDevice");
+ //
+ // to work.
+ if (strcmp(pName, "vkCreateDevice") == 0)
+ return hook->proc;
+
ALOGE(
"Invalid use of vkGetInstanceProcAddr to query %s without an "
"instance",
pName);
- // Some naughty layers expect
- //
- // vkGetInstanceProcAddr(VK_NULL_HANDLE, "vkCreateDevice");
- //
- // to work.
- return (strcmp(pName, "vkCreateDevice") == 0) ? hook->proc : nullptr;
+ return nullptr;
}
PFN_vkVoidFunction proc;
diff --git a/vulkan/libvulkan/stubhal.cpp b/vulkan/libvulkan/stubhal.cpp
index 89fcebb..a74d370 100644
--- a/vulkan/libvulkan/stubhal.cpp
+++ b/vulkan/libvulkan/stubhal.cpp
@@ -83,7 +83,7 @@
std::lock_guard<std::mutex> lock(g_instance_mutex);
ssize_t idx =
reinterpret_cast<hwvulkan_dispatch_t*>(instance) - &g_instances[0];
- ALOG_ASSERT(idx >= 0 && idx < g_instance_used.size(),
+ ALOG_ASSERT(idx >= 0 && static_cast<size_t>(idx) < g_instance_used.size(),
"DestroyInstance: invalid instance handle");
g_instance_used[static_cast<size_t>(idx)] = false;
}
diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp
index e990cf4..69e8e84 100644
--- a/vulkan/libvulkan/swapchain.cpp
+++ b/vulkan/libvulkan/swapchain.cpp
@@ -329,6 +329,17 @@
int err;
VkResult result = VK_SUCCESS;
+ ALOGV("vkCreateSwapchainKHR: surface=0x%" PRIx64
+ " minImageCount=%u imageFormat=%u imageColorSpace=%u"
+ " imageExtent=%ux%u imageUsage=%#x preTransform=%u presentMode=%u"
+ " oldSwapchain=0x%" PRIx64,
+ reinterpret_cast<uint64_t>(create_info->surface),
+ create_info->minImageCount, create_info->imageFormat,
+ create_info->imageColorSpace, create_info->imageExtent.width,
+ create_info->imageExtent.height, create_info->imageUsage,
+ create_info->preTransform, create_info->presentMode,
+ reinterpret_cast<uint64_t>(create_info->oldSwapchain));
+
if (!allocator)
allocator = &GetData(device).allocator;
@@ -348,9 +359,32 @@
"swapchain present mode %d not supported",
create_info->presentMode);
+ Surface& surface = *SurfaceFromHandle(create_info->surface);
+
+ // -- Reset the native window --
+ // The native window might have been used previously, and had its properties
+ // changed from defaults. That will affect the answer we get for queries
+ // like MIN_UNDEQUED_BUFFERS. Reset to a known/default state before we
+ // attempt such queries.
+
+ err = native_window_set_buffer_count(surface.window.get(), 0);
+ if (err != 0) {
+ ALOGE("native_window_set_buffer_count(0) failed: %s (%d)",
+ strerror(-err), err);
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
+
+ err = surface.window->setSwapInterval(surface.window.get(), 1);
+ if (err != 0) {
+ // TODO(jessehall): Improve error reporting. Can we enumerate possible
+ // errors and translate them to valid Vulkan result codes?
+ ALOGE("native_window->setSwapInterval(1) failed: %s (%d)",
+ strerror(-err), err);
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
+
// -- Configure the native window --
- Surface& surface = *SurfaceFromHandle(create_info->surface);
const auto& dispatch = GetData(device).driver;
int native_format = HAL_PIXEL_FORMAT_RGBA_8888;
@@ -451,8 +485,8 @@
if (err != 0) {
// TODO(jessehall): Improve error reporting. Can we enumerate possible
// errors and translate them to valid Vulkan result codes?
- ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err),
- err);
+ ALOGE("native_window_set_buffer_count(%d) failed: %s (%d)", num_images,
+ strerror(-err), err);
return VK_ERROR_INITIALIZATION_FAILED;
}
@@ -477,14 +511,14 @@
return VK_ERROR_INITIALIZATION_FAILED;
}
- err = surface.window->setSwapInterval(
- surface.window.get(),
- create_info->presentMode == VK_PRESENT_MODE_MAILBOX_KHR ? 0 : 1);
+ int swap_interval =
+ create_info->presentMode == VK_PRESENT_MODE_MAILBOX_KHR ? 0 : 1;
+ err = surface.window->setSwapInterval(surface.window.get(), swap_interval);
if (err != 0) {
// TODO(jessehall): Improve error reporting. Can we enumerate possible
// errors and translate them to valid Vulkan result codes?
- ALOGE("native_window->setSwapInterval failed: %s (%d)", strerror(-err),
- err);
+ ALOGE("native_window->setSwapInterval(%d) failed: %s (%d)",
+ swap_interval, strerror(-err), err);
return VK_ERROR_INITIALIZATION_FAILED;
}
diff --git a/vulkan/tools/vkinfo.cpp b/vulkan/tools/vkinfo.cpp
index e97e5f5..62d8240 100644
--- a/vulkan/tools/vkinfo.cpp
+++ b/vulkan/tools/vkinfo.cpp
@@ -162,8 +162,11 @@
uint32_t num_extensions = 0;
for (const auto& desired_ext : kDesiredExtensions) {
bool available = HasExtension(info.extensions, desired_ext);
- for (size_t i = 0; !available && i < info.layer_extensions.size(); i++)
- available = HasExtension(info.layer_extensions[i], desired_ext);
+ if (options.validate) {
+ for (size_t i = 0; !available && i < info.layer_extensions.size();
+ i++)
+ available = HasExtension(info.layer_extensions[i], desired_ext);
+ }
if (available)
extensions[num_extensions++] = desired_ext;
}
@@ -179,12 +182,11 @@
// clang-format off
const char *kValidationLayers[] = {
"VK_LAYER_GOOGLE_threading",
+ "VK_LAYER_LUNARG_parameter_validation",
"VK_LAYER_LUNARG_device_limits",
- "VK_LAYER_LUNARG_draw_state",
- "VK_LAYER_LUNARG_image",
- "VK_LAYER_LUNARG_mem_tracker",
"VK_LAYER_LUNARG_object_tracker",
- "VK_LAYER_LUNARG_param_checker",
+ "VK_LAYER_LUNARG_image",
+ "VK_LAYER_LUNARG_core_validation",
"VK_LAYER_LUNARG_swapchain",
"VK_LAYER_GOOGLE_unique_objects"
};
@@ -236,8 +238,12 @@
uint32_t num_extensions = 0;
for (const auto& desired_ext : kDesiredExtensions) {
bool available = HasExtension(info->extensions, desired_ext);
- for (size_t i = 0; !available && i < info->layer_extensions.size(); i++)
- available = HasExtension(info->layer_extensions[i], desired_ext);
+ if (options.validate) {
+ for (size_t i = 0; !available && i < info->layer_extensions.size();
+ i++)
+ available =
+ HasExtension(info->layer_extensions[i], desired_ext);
+ }
if (available)
extensions[num_extensions++] = desired_ext;
}
@@ -245,12 +251,11 @@
// clang-format off
const char *kValidationLayers[] = {
"VK_LAYER_GOOGLE_threading",
+ "VK_LAYER_LUNARG_parameter_validation",
"VK_LAYER_LUNARG_device_limits",
- "VK_LAYER_LUNARG_draw_state",
- "VK_LAYER_LUNARG_image",
- "VK_LAYER_LUNARG_mem_tracker",
"VK_LAYER_LUNARG_object_tracker",
- "VK_LAYER_LUNARG_param_checker",
+ "VK_LAYER_LUNARG_image",
+ "VK_LAYER_LUNARG_core_validation",
"VK_LAYER_LUNARG_swapchain",
"VK_LAYER_GOOGLE_unique_objects"
};