110839Sandreas.sandberg@arm.com/* 210839Sandreas.sandberg@arm.com * Copyright (c) 2015 ARM Limited 310839Sandreas.sandberg@arm.com * All rights reserved 410839Sandreas.sandberg@arm.com * 510839Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall 610839Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual 710839Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 810839Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 910839Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1010839Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1110839Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1210839Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form. 1310839Sandreas.sandberg@arm.com * 1410839Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 1510839Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 1610839Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 1710839Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 1810839Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1910839Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 2010839Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 2110839Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 2210839Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 2310839Sandreas.sandberg@arm.com * this software without specific prior written permission. 2410839Sandreas.sandberg@arm.com * 2510839Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610839Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710839Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810839Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910839Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010839Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110839Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210839Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310839Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410839Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510839Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610839Sandreas.sandberg@arm.com * 3710839Sandreas.sandberg@arm.com * Authors: Andreas Sandberg 3810839Sandreas.sandberg@arm.com */ 3910839Sandreas.sandberg@arm.com 4010839Sandreas.sandberg@arm.com#ifndef __BASE_FRAMEBUFFER_HH__ 4110839Sandreas.sandberg@arm.com#define __BASE_FRAMEBUFFER_HH__ 4210839Sandreas.sandberg@arm.com 4310839Sandreas.sandberg@arm.com#include <cmath> 4410839Sandreas.sandberg@arm.com#include <cstdint> 4510839Sandreas.sandberg@arm.com 4610907Sandreas.sandberg@arm.com#include <string> 4710839Sandreas.sandberg@arm.com#include <vector> 4810839Sandreas.sandberg@arm.com 4910907Sandreas.sandberg@arm.com#include "base/compiler.hh" 5010907Sandreas.sandberg@arm.com#include "base/cprintf.hh" 5112366Sgabeblack@google.com#include "base/pixel.hh" 5210907Sandreas.sandberg@arm.com#include "base/str.hh" 5310839Sandreas.sandberg@arm.com#include "base/types.hh" 5410907Sandreas.sandberg@arm.com#include "sim/serialize.hh" 5510839Sandreas.sandberg@arm.com 5610839Sandreas.sandberg@arm.com/** 5710839Sandreas.sandberg@arm.com * Internal gem5 representation of a frame buffer 5810839Sandreas.sandberg@arm.com * 5910839Sandreas.sandberg@arm.com * Display controllers and other devices producing images are expected 6010839Sandreas.sandberg@arm.com * to use this class to represent the final image. 6110839Sandreas.sandberg@arm.com * 6210839Sandreas.sandberg@arm.com * Pixels are indexed relative to the upper left corner of the 6310839Sandreas.sandberg@arm.com * image. That is, the pixel at position (0, 0) is the upper left 6410839Sandreas.sandberg@arm.com * corner. The backing store is a linear vector of Pixels ordered left 6510839Sandreas.sandberg@arm.com * to right starting in the upper left corner. 6610839Sandreas.sandberg@arm.com */ 6710907Sandreas.sandberg@arm.comclass FrameBuffer : public Serializable 6810839Sandreas.sandberg@arm.com{ 6910839Sandreas.sandberg@arm.com public: 7010839Sandreas.sandberg@arm.com /** 7110839Sandreas.sandberg@arm.com * Create a frame buffer of a given size. 7210839Sandreas.sandberg@arm.com * 7310839Sandreas.sandberg@arm.com * @param width Width in pixels 7410839Sandreas.sandberg@arm.com * @param height Height in pixels 7510839Sandreas.sandberg@arm.com */ 7610839Sandreas.sandberg@arm.com FrameBuffer(unsigned width, unsigned height); 7710839Sandreas.sandberg@arm.com /** Create an empty (0x0) frame buffer */ 7810839Sandreas.sandberg@arm.com FrameBuffer(); 7910839Sandreas.sandberg@arm.com 8010839Sandreas.sandberg@arm.com virtual ~FrameBuffer(); 8110839Sandreas.sandberg@arm.com 8211168Sandreas.hansson@arm.com void serialize(CheckpointOut &cp) const override; 8311168Sandreas.hansson@arm.com void unserialize(CheckpointIn &cp) override; 8410907Sandreas.sandberg@arm.com 8510839Sandreas.sandberg@arm.com /** 8610839Sandreas.sandberg@arm.com * Resize the frame buffer. 8710839Sandreas.sandberg@arm.com * 8810839Sandreas.sandberg@arm.com * This method resizes frame buffer including the backing 8910839Sandreas.sandberg@arm.com * store. The contents of the backing store are undefined after 9010839Sandreas.sandberg@arm.com * this operation. 9110839Sandreas.sandberg@arm.com * 9210839Sandreas.sandberg@arm.com * @param with Width in pixels. 9310839Sandreas.sandberg@arm.com * @param height Height in pixels. 9410839Sandreas.sandberg@arm.com */ 9510839Sandreas.sandberg@arm.com void resize(unsigned width, unsigned height); 9610839Sandreas.sandberg@arm.com 9710839Sandreas.sandberg@arm.com /** Frame buffer width in pixels */ 9810839Sandreas.sandberg@arm.com unsigned width() const { return _width; } 9910839Sandreas.sandberg@arm.com /** Frame buffer height in pixels */ 10010839Sandreas.sandberg@arm.com unsigned height() const { return _height; } 10110839Sandreas.sandberg@arm.com /** Total number of pixels in frame buffer */ 10210839Sandreas.sandberg@arm.com unsigned area() const { return _width * _height; } 10310839Sandreas.sandberg@arm.com 10410839Sandreas.sandberg@arm.com /** 10510839Sandreas.sandberg@arm.com * Fill the frame buffer with a single pixel value 10610839Sandreas.sandberg@arm.com * 10710839Sandreas.sandberg@arm.com * @param pixel Pixel value to fill with. 10810839Sandreas.sandberg@arm.com */ 10910839Sandreas.sandberg@arm.com void fill(const Pixel &pixel); 11010839Sandreas.sandberg@arm.com /** 11110839Sandreas.sandberg@arm.com * Fill the frame buffer with black pixels 11210839Sandreas.sandberg@arm.com */ 11310839Sandreas.sandberg@arm.com void clear(); 11410839Sandreas.sandberg@arm.com 11510839Sandreas.sandberg@arm.com /** 11610839Sandreas.sandberg@arm.com * Fill the frame buffer with pixel data from an external buffer 11710839Sandreas.sandberg@arm.com * of the same width and height as this frame buffer. 11810839Sandreas.sandberg@arm.com * 11910839Sandreas.sandberg@arm.com * @param fb External frame buffer 12010839Sandreas.sandberg@arm.com * @param conv Pixel conversion helper 12110839Sandreas.sandberg@arm.com */ 12210839Sandreas.sandberg@arm.com void copyIn(const uint8_t *fb, const PixelConverter &conv); 12310839Sandreas.sandberg@arm.com /** 12410839Sandreas.sandberg@arm.com * Fill the frame buffer with pixel data from an external buffer 12510839Sandreas.sandberg@arm.com * of the same width and height as this frame buffer. 12610839Sandreas.sandberg@arm.com * 12710839Sandreas.sandberg@arm.com * @param fb External frame buffer 12810839Sandreas.sandberg@arm.com * @param conv Pixel conversion helper 12910839Sandreas.sandberg@arm.com */ 13010839Sandreas.sandberg@arm.com void copyIn(const std::vector<uint8_t> &fb, const PixelConverter &conv) { 13110839Sandreas.sandberg@arm.com copyIn(fb.data(), conv); 13210839Sandreas.sandberg@arm.com } 13310839Sandreas.sandberg@arm.com 13410839Sandreas.sandberg@arm.com /** 13510839Sandreas.sandberg@arm.com * Store the contents of this frame buffer in an external buffer 13610839Sandreas.sandberg@arm.com * of the same width and height as this frame buffer. 13710839Sandreas.sandberg@arm.com * 13810839Sandreas.sandberg@arm.com * @param fb External frame buffer 13910839Sandreas.sandberg@arm.com * @param conv Pixel conversion helper 14010839Sandreas.sandberg@arm.com */ 14110839Sandreas.sandberg@arm.com void copyOut(uint8_t *fb, const PixelConverter &conv) const; 14210839Sandreas.sandberg@arm.com /** 14310839Sandreas.sandberg@arm.com * Store the contents of this frame buffer in an external buffer 14410839Sandreas.sandberg@arm.com * of the same width and height as this frame buffer. 14510839Sandreas.sandberg@arm.com * 14610839Sandreas.sandberg@arm.com * @param fb External frame buffer 14710839Sandreas.sandberg@arm.com * @param conv Pixel conversion helper 14810839Sandreas.sandberg@arm.com */ 14910839Sandreas.sandberg@arm.com void copyOut(std::vector<uint8_t> &fb, const PixelConverter &conv) const { 15010839Sandreas.sandberg@arm.com copyOut(fb.data(), conv); 15110839Sandreas.sandberg@arm.com } 15210839Sandreas.sandberg@arm.com 15310839Sandreas.sandberg@arm.com /** 15410839Sandreas.sandberg@arm.com * Get a pixel from an (x, y) coordinate 15510839Sandreas.sandberg@arm.com * 15610839Sandreas.sandberg@arm.com * @param x Distance from the left margin. 15710839Sandreas.sandberg@arm.com * @param y Distance from the top of the frame. 15810839Sandreas.sandberg@arm.com */ 15910839Sandreas.sandberg@arm.com const Pixel &pixel(unsigned x, unsigned y) const { 16010839Sandreas.sandberg@arm.com assert(x < _width); 16110839Sandreas.sandberg@arm.com assert(y < _height); 16210839Sandreas.sandberg@arm.com 16310839Sandreas.sandberg@arm.com return pixels[y * _width + x]; 16410839Sandreas.sandberg@arm.com } 16510839Sandreas.sandberg@arm.com 16610839Sandreas.sandberg@arm.com /** 16710839Sandreas.sandberg@arm.com * Get a pixel from an (x, y) coordinate 16810839Sandreas.sandberg@arm.com * 16910839Sandreas.sandberg@arm.com * @param x Distance from the left margin. 17010839Sandreas.sandberg@arm.com * @param y Distance from the top of the frame. 17110839Sandreas.sandberg@arm.com */ 17210839Sandreas.sandberg@arm.com Pixel &pixel(unsigned x, unsigned y) { 17310839Sandreas.sandberg@arm.com assert(x < _width); 17410839Sandreas.sandberg@arm.com assert(y < _height); 17510839Sandreas.sandberg@arm.com 17610839Sandreas.sandberg@arm.com return pixels[y * _width + x]; 17710839Sandreas.sandberg@arm.com } 17810839Sandreas.sandberg@arm.com 17910839Sandreas.sandberg@arm.com /** 18010839Sandreas.sandberg@arm.com * Create a hash of the image that can be used for quick 18110839Sandreas.sandberg@arm.com * comparisons. 18210839Sandreas.sandberg@arm.com */ 18310839Sandreas.sandberg@arm.com uint64_t getHash() const; 18410839Sandreas.sandberg@arm.com 18510839Sandreas.sandberg@arm.com /** 18610839Sandreas.sandberg@arm.com * Static "dummy" frame buffer. 18710839Sandreas.sandberg@arm.com * 18810839Sandreas.sandberg@arm.com * This is a dummy frame buffer that can be used as a place holder 18910839Sandreas.sandberg@arm.com * for devices that always expect a frame buffer to be present. 19010839Sandreas.sandberg@arm.com */ 19110839Sandreas.sandberg@arm.com static const FrameBuffer dummy; 19210839Sandreas.sandberg@arm.com 19310839Sandreas.sandberg@arm.com /** Frame buffer backing store */ 19410839Sandreas.sandberg@arm.com std::vector<Pixel> pixels; 19510839Sandreas.sandberg@arm.com 19610839Sandreas.sandberg@arm.com protected: 19710839Sandreas.sandberg@arm.com /** Width in pixels */ 19810839Sandreas.sandberg@arm.com unsigned _width; 19910839Sandreas.sandberg@arm.com /** Height in pixels */ 20010839Sandreas.sandberg@arm.com unsigned _height; 20110839Sandreas.sandberg@arm.com}; 20210839Sandreas.sandberg@arm.com 20310839Sandreas.sandberg@arm.com#endif // __BASE_FRAMEBUFFER_HH__ 204