display_surface.h revision 3f82d31341f66d0c58e1ec3360ea5f528ffe0ea4
1#ifndef ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SURFACE_H_ 2#define ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SURFACE_H_ 3 4#include <pdx/file_handle.h> 5#include <pdx/service.h> 6#include <private/dvr/display_protocol.h> 7#include <private/dvr/ring_buffer.h> 8 9#include <functional> 10#include <iterator> 11#include <memory> 12#include <string> 13#include <vector> 14 15#include "acquired_buffer.h" 16#include "surface_channel.h" 17#include "video_mesh_surface.h" 18 19namespace android { 20namespace dvr { 21 22class DisplayService; 23 24// DisplaySurface is the service-side notion of a client display context. It is 25// responsible for managing display buffer format, geometry, and state, and 26// maintains the buffer consumers connected to the client. 27class DisplaySurface : public SurfaceChannel { 28 public: 29 DisplaySurface(DisplayService* service, int surface_id, int process_id, 30 int width, int height, int format, int usage, int flags); 31 ~DisplaySurface() override; 32 33 int process_id() const { return process_id_; } 34 int width() const { return width_; } 35 int height() const { return height_; } 36 int format() const { return format_; } 37 int usage() const { return usage_; } 38 int flags() const { return flags_; } 39 40 bool client_visible() const { return client_visible_; } 41 int client_z_order() const { return client_z_order_; } 42 bool client_exclude_from_blur() const { return client_exclude_from_blur_; } 43 bool client_blur_behind() const { return client_blur_behind_; } 44 45 bool manager_visible() const { return manager_visible_; } 46 int manager_z_order() const { return manager_z_order_; } 47 float manager_blur() const { return manager_blur_; } 48 49 bool video_mesh_surfaces_updated() const { 50 return video_mesh_surfaces_updated_; 51 } 52 53 volatile const DisplaySurfaceMetadata* GetMetadataBufferPtr() { 54 if (EnsureMetadataBuffer()) { 55 void* addr = nullptr; 56 metadata_buffer_->GetBlobReadWritePointer(metadata_size(), &addr); 57 return static_cast<const volatile DisplaySurfaceMetadata*>(addr); 58 } else { 59 return nullptr; 60 } 61 } 62 63 uint32_t GetRenderBufferIndex(int buffer_id); 64 bool IsBufferAvailable(); 65 bool IsBufferPosted(); 66 AcquiredBuffer AcquireCurrentBuffer(); 67 68 // Get the newest buffer. Up to one buffer will be skipped. If a buffer is 69 // skipped, it will be stored in skipped_buffer if non null. 70 AcquiredBuffer AcquireNewestAvailableBuffer(AcquiredBuffer* skipped_buffer); 71 72 // Display manager interface to control visibility and z order. 73 void ManagerSetVisible(bool visible); 74 void ManagerSetZOrder(int z_order); 75 void ManagerSetBlur(float blur); 76 77 // A surface must be set visible by both the client and the display manager to 78 // be visible on screen. 79 bool IsVisible() const { return client_visible_ && manager_visible_; } 80 81 // A surface is blurred if the display manager requests it. 82 bool IsBlurred() const { return manager_blur_ > 0.0f; } 83 84 // Set by HardwareComposer to the current logical layer order of this surface. 85 void SetLayerOrder(int layer_order) { layer_order_ = layer_order; } 86 // Gets the unique z-order index of this surface among other visible surfaces. 87 // This is not the same as the hardware layer index, as not all display 88 // surfaces map directly to hardware layers. Lower layer orders should be 89 // composited underneath higher layer orders. 90 int layer_order() const { return layer_order_; } 91 92 // Lock all video mesh surfaces so that VideoMeshCompositor can access them. 93 std::vector<std::shared_ptr<VideoMeshSurface>> GetVideoMeshSurfaces(); 94 95 private: 96 friend class DisplayService; 97 98 // The capacity of the pending buffer queue. Should be enough to hold all the 99 // buffers of this DisplaySurface, although in practice only 1 or 2 frames 100 // will be pending at a time. 101 static constexpr int kMaxPostedBuffers = 102 kSurfaceBufferMaxCount * kSurfaceViewMaxCount; 103 104 // Returns whether a frame is available without locking the mutex. 105 bool IsFrameAvailableNoLock() const; 106 107 // Dispatches display surface messages to the appropriate handlers. This 108 // handler runs on the displayd message dispatch thread. 109 pdx::Status<void> HandleMessage(pdx::Message& message) override; 110 111 // Sets display surface's client-controlled attributes. 112 int OnClientSetAttributes(pdx::Message& message, 113 const DisplaySurfaceAttributes& attributes); 114 115 // Creates a BufferHubQueue associated with this surface and returns the PDX 116 // handle of its producer side to the client. 117 pdx::LocalChannelHandle OnCreateBufferQueue(pdx::Message& message); 118 119 // Creates a video mesh surface associated with this surface and returns its 120 // PDX handle to the client. 121 pdx::RemoteChannelHandle OnCreateVideoMeshSurface(pdx::Message& message); 122 123 // Client interface (called through IPC) to set visibility and z order. 124 void ClientSetVisible(bool visible); 125 void ClientSetZOrder(int z_order); 126 void ClientSetExcludeFromBlur(bool exclude_from_blur); 127 void ClientSetBlurBehind(bool blur_behind); 128 129 // Dequeue all available buffers from the consumer queue. 130 void DequeueBuffersLocked(); 131 132 DisplaySurface(const DisplaySurface&) = delete; 133 void operator=(const DisplaySurface&) = delete; 134 135 int process_id_; 136 137 // Synchronizes access to mutable state below between message dispatch thread, 138 // epoll event thread, and frame post thread. 139 mutable std::mutex lock_; 140 141 // The consumer end of a BufferHubQueue. VrFlinger allocates and controls the 142 // buffer queue and pass producer end to the app and the consumer end to 143 // compositor. 144 // TODO(jwcai) Add support for multiple buffer queues per display surface. 145 std::shared_ptr<ConsumerQueue> consumer_queue_; 146 147 // In a triple-buffered surface, up to kMaxPostedBuffers buffers may be 148 // posted and pending. 149 RingBuffer<AcquiredBuffer> acquired_buffers_; 150 151 // Provides access to VideoMeshSurface. Here we don't want to increase 152 // the reference count immediately on allocation, will leave it into 153 // compositor's hand. 154 std::vector<std::weak_ptr<VideoMeshSurface>> pending_video_mesh_surfaces_; 155 volatile bool video_mesh_surfaces_updated_; 156 157 // Surface parameters. 158 int width_; 159 int height_; 160 int format_; 161 int usage_; 162 int flags_; 163 bool client_visible_; 164 int client_z_order_; 165 bool client_exclude_from_blur_; 166 bool client_blur_behind_; 167 bool manager_visible_; 168 int manager_z_order_; 169 float manager_blur_; 170 int layer_order_; 171 172 // The monotonically increasing index for allocated buffers in this surface. 173 uint32_t allocated_buffer_index_; 174 // Maps from the buffer id to the corresponding allocated buffer index. 175 std::unordered_map<int, uint32_t> buffer_id_to_index_; 176}; 177 178} // namespace dvr 179} // namespace android 180 181#endif // ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SURFACE_H_ 182