Merge "Hold onto FileHandles for glBindSharedBufferQCOM calls" into oc-dev
diff --git a/libs/vr/libdisplay/include/private/dvr/late_latch.h b/libs/vr/libdisplay/include/private/dvr/late_latch.h
index d0eff51..b7c5e4f 100644
--- a/libs/vr/libdisplay/include/private/dvr/late_latch.h
+++ b/libs/vr/libdisplay/include/private/dvr/late_latch.h
@@ -178,6 +178,9 @@
LateLatchOutput* eds_late_latch_output_;
DvrPose* pose_client_;
+
+ pdx::LocalHandle surface_metadata_fd_;
+ pdx::LocalHandle pose_buffer_fd_;
};
} // namespace dvr
diff --git a/libs/vr/libdisplay/late_latch.cpp b/libs/vr/libdisplay/late_latch.cpp
index b1a1589..e67f009 100644
--- a/libs/vr/libdisplay/late_latch.cpp
+++ b/libs/vr/libdisplay/late_latch.cpp
@@ -252,7 +252,8 @@
LocalHandle&& surface_metadata_fd)
: is_app_late_latch_(is_app_late_latch),
app_late_latch_output_(NULL),
- eds_late_latch_output_(NULL) {
+ eds_late_latch_output_(NULL),
+ surface_metadata_fd_(std::move(surface_metadata_fd)) {
CHECK_GL();
glGenBuffers(1, &input_buffer_id_);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, input_buffer_id_);
@@ -264,12 +265,11 @@
GL_DYNAMIC_COPY);
CHECK_GL();
- LocalHandle pose_buffer_fd;
pose_client_ = dvrPoseCreate();
if (!pose_client_) {
ALOGE("LateLatch Error: failed to create pose client");
} else {
- int ret = privateDvrPoseGetRingBufferFd(pose_client_, &pose_buffer_fd);
+ int ret = privateDvrPoseGetRingBufferFd(pose_client_, &pose_buffer_fd_);
if (ret < 0) {
ALOGE("LateLatch Error: failed to get pose ring buffer");
}
@@ -280,20 +280,20 @@
if (!glBindSharedBufferQCOM) {
ALOGE("Error: Missing gralloc buffer extension, no pose data");
} else {
- if (pose_buffer_fd) {
+ if (pose_buffer_fd_) {
glBindBuffer(GL_SHADER_STORAGE_BUFFER, pose_buffer_object_);
glBindSharedBufferQCOM(GL_SHADER_STORAGE_BUFFER,
kPoseAsyncBufferTotalCount * sizeof(DvrPoseAsync),
- pose_buffer_fd.Release());
+ pose_buffer_fd_.Get());
}
CHECK_GL();
}
glBindBuffer(GL_SHADER_STORAGE_BUFFER, metadata_buffer_id_);
- if (surface_metadata_fd && glBindSharedBufferQCOM) {
+ if (surface_metadata_fd_ && glBindSharedBufferQCOM) {
glBindSharedBufferQCOM(GL_SHADER_STORAGE_BUFFER,
sizeof(DisplaySurfaceMetadata),
- surface_metadata_fd.Release());
+ surface_metadata_fd_.Get());
} else {
// Fall back on internal metadata buffer when none provided, for example
// when distortion is done in the application process.
diff --git a/libs/vr/libvrflinger/compositor.cpp b/libs/vr/libvrflinger/compositor.cpp
index 07e4a8b..239ef75 100644
--- a/libs/vr/libvrflinger/compositor.cpp
+++ b/libs/vr/libvrflinger/compositor.cpp
@@ -246,16 +246,17 @@
class Compositor::RenderPoseBufferObject {
public:
- RenderPoseBufferObject(LocalHandle&& render_pose_buffer_fd) {
+ RenderPoseBufferObject(LocalHandle&& render_pose_buffer_fd) :
+ fd_(std::move(render_pose_buffer_fd)) {
// Create new pose tracking buffer for this surface.
glGenBuffers(1, &render_pose_buffer_object_);
glBindBuffer(GL_UNIFORM_BUFFER, render_pose_buffer_object_);
- if (render_pose_buffer_fd) {
+ if (fd_) {
LOG_ALWAYS_FATAL_IF(!glBindSharedBufferQCOM);
if (glBindSharedBufferQCOM)
glBindSharedBufferQCOM(GL_UNIFORM_BUFFER,
sizeof(DisplaySurfaceMetadata),
- render_pose_buffer_fd.Get());
+ fd_.Get());
else
ALOGE("Error: Missing gralloc buffer extension");
CHECK_GL();
@@ -271,6 +272,7 @@
// Render pose buffer object. This contains an array of poses that corresponds
// with the surface buffers.
GLuint render_pose_buffer_object_;
+ LocalHandle fd_;
RenderPoseBufferObject(const RenderPoseBufferObject&) = delete;
void operator=(const RenderPoseBufferObject&) = delete;
@@ -429,6 +431,7 @@
}
void Compositor::Shutdown() {
+ glFinish();
render_target_[0].Destroy();
render_target_[1].Destroy();
layers_.clear();