| // Copyright 2020 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_UI_EXAMPLES_FRAME_COMPRESSION_SOFTWARE_VIEW_H_ |
| #define SRC_UI_EXAMPLES_FRAME_COMPRESSION_SOFTWARE_VIEW_H_ |
| |
| #include <fuchsia/sysmem/cpp/fidl.h> |
| #include <lib/inspect/cpp/inspect.h> |
| #include <lib/inspect/cpp/value_list.h> |
| #include <lib/inspect/cpp/vmo/types.h> |
| |
| #include <unordered_map> |
| #include <vector> |
| |
| #include "base_view.h" |
| #include "src/lib/fxl/macros.h" |
| |
| namespace frame_compression { |
| |
| class SoftwareView : public BaseView { |
| public: |
| SoftwareView(scenic::ViewContext context, uint64_t modifier, uint32_t width, uint32_t height, |
| uint32_t paint_count, FILE* png_fp, inspect::Node inspect_node); |
| ~SoftwareView() override = default; |
| |
| private: |
| struct Tile { |
| bool operator==(const Tile& other) const { |
| return memcmp(data, other.data, kTileNumBytes) == 0; |
| } |
| uint32_t* data; |
| }; |
| |
| class TileHashFunction { |
| public: |
| size_t operator()(const Tile& tile) const { |
| size_t result = 0; |
| for (size_t i = 0; i < kTileNumPixels; ++i) { |
| result = (result * 31) ^ tile.data[i]; |
| } |
| return result; |
| } |
| }; |
| |
| struct Image { |
| uint32_t image_id; |
| uint8_t* vmo_ptr; |
| size_t image_bytes; |
| size_t image_bytes_used = 0; |
| size_t image_bytes_deduped = 0; |
| uint32_t stride = 0; |
| uint32_t width_in_tiles = 0; |
| uint32_t height_in_tiles = 0; |
| bool needs_flush; |
| std::unordered_map<Tile, uint32_t, TileHashFunction> tiles; |
| inspect::LazyNode inspect_node; |
| }; |
| |
| // |scenic::BaseView| |
| void OnSceneInvalidated(fuchsia::images::PresentationInfo presentation_info) override; |
| |
| void SetPixelsFromColorOffset(Image& image, uint32_t color_offset); |
| void SetAfbcPixelsFromColorOffset(Image& image, uint32_t color_offset); |
| void SetLinearPixelsFromColorOffset(Image& image, uint32_t color_offset); |
| |
| void SetPixelsFromPng(Image& image, png_structp png); |
| void SetAfbcPixelsFromPng(Image& image, png_structp png); |
| void SetLinearPixelsFromPng(Image& image, png_structp png); |
| |
| fit::promise<inspect::Inspector> PopulateStats() const; |
| fit::promise<inspect::Inspector> PopulateImageStats(const Image& image) const; |
| |
| const uint64_t modifier_; |
| const uint32_t paint_count_; |
| FILE* const png_fp_; |
| fuchsia::sysmem::AllocatorSyncPtr sysmem_allocator_; |
| Image images_[kNumImages]; |
| std::vector<png_bytep> row_pointers_; |
| std::vector<uint32_t> scratch_; |
| inspect::LazyNode inspect_node_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(SoftwareView); |
| }; |
| |
| } // namespace frame_compression |
| |
| #endif // SRC_UI_EXAMPLES_FRAME_COMPRESSION_SOFTWARE_VIEW_H_ |