| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_GRAPHICS_DISPLAY_DRIVERS_GOLDFISH_DISPLAY_RENDER_CONTROL_H_ |
| #define SRC_GRAPHICS_DISPLAY_DRIVERS_GOLDFISH_DISPLAY_RENDER_CONTROL_H_ |
| |
| #include <fidl/fuchsia.hardware.goldfish.pipe/cpp/wire.h> |
| #include <lib/fzl/pinned-vmo.h> |
| #include <zircon/types.h> |
| |
| #include <map> |
| #include <memory> |
| |
| #include <ddktl/device.h> |
| #include <fbl/strong_int.h> |
| |
| #include "src/devices/lib/goldfish/pipe_io/pipe_io.h" |
| |
| namespace goldfish { |
| |
| // A strong-typed ID of the ColorBuffer used in goldfish rendering. |
| DEFINE_STRONG_INT(HostColorBufferId, uint32_t); |
| |
| constexpr HostColorBufferId kInvalidHostColorBufferId = HostColorBufferId(0u); |
| |
| constexpr inline uint32_t ToRenderControlHostColorBufferId(HostColorBufferId host_color_buffer_id) { |
| return host_color_buffer_id.value(); |
| } |
| constexpr inline HostColorBufferId ToHostColorBufferId( |
| uint32_t render_control_host_color_buffer_id) { |
| return HostColorBufferId(render_control_host_color_buffer_id); |
| } |
| |
| // A strong-typed ID of the goldfish host renderer display. |
| DEFINE_STRONG_INT(HostDisplayId, uint32_t); |
| |
| constexpr HostDisplayId kInvalidHostDisplayId = HostDisplayId(0u); |
| |
| constexpr inline uint32_t ToRenderControlHostDisplayId(HostDisplayId host_display_id) { |
| return host_display_id.value(); |
| } |
| constexpr inline HostDisplayId ToHostDisplayId(uint32_t render_control_host_display_id) { |
| return HostDisplayId(render_control_host_display_id); |
| } |
| |
| // This implements a client of goldfish renderControl API over |
| // goldfish pipe communication. The methods are defined in |
| // https://android.googlesource.com/device/generic/goldfish-opengl/+/master/system/renderControl_enc/README |
| class RenderControl { |
| public: |
| RenderControl() = default; |
| zx_status_t InitRcPipe(fidl::WireSyncClient<fuchsia_hardware_goldfish_pipe::GoldfishPipe>); |
| |
| int32_t GetFbParam(uint32_t param, int32_t default_value); |
| |
| zx::result<HostColorBufferId> CreateColorBuffer(uint32_t width, uint32_t height, uint32_t format); |
| zx_status_t OpenColorBuffer(HostColorBufferId host_color_buffer_id); |
| zx_status_t CloseColorBuffer(HostColorBufferId host_color_buffer_id); |
| |
| // Zero means success; non-zero value means the call failed. |
| using RcResult = int32_t; |
| zx::result<RcResult> SetColorBufferVulkanMode(HostColorBufferId host_color_buffer_id, |
| uint32_t mode); |
| zx::result<RcResult> UpdateColorBuffer(HostColorBufferId host_color_buffer_id, |
| const fzl::PinnedVmo& pinned_vmo, uint32_t width, |
| uint32_t height, uint32_t format, size_t size); |
| zx_status_t FbPost(HostColorBufferId host_color_buffer_id); |
| |
| zx::result<HostDisplayId> CreateDisplay(); |
| zx::result<RcResult> DestroyDisplay(HostDisplayId display_id); |
| zx::result<RcResult> SetDisplayColorBuffer(HostDisplayId display_id, |
| HostColorBufferId host_color_buffer_id); |
| zx::result<RcResult> SetDisplayPose(HostDisplayId display_id, int32_t x, int32_t y, uint32_t w, |
| uint32_t h); |
| |
| PipeIo* pipe_io() { return pipe_io_.get(); } |
| |
| private: |
| std::unique_ptr<PipeIo> pipe_io_; |
| DISALLOW_COPY_ASSIGN_AND_MOVE(RenderControl); |
| }; |
| |
| } // namespace goldfish |
| |
| #endif // SRC_GRAPHICS_DISPLAY_DRIVERS_GOLDFISH_DISPLAY_RENDER_CONTROL_H_ |