diff options
Diffstat (limited to 'libkmstest/mappedbuffer.h')
-rw-r--r-- | libkmstest/mappedbuffer.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/libkmstest/mappedbuffer.h b/libkmstest/mappedbuffer.h new file mode 100644 index 0000000..7c1215c --- /dev/null +++ b/libkmstest/mappedbuffer.h @@ -0,0 +1,95 @@ +#pragma once + +#include "kms++.h" + +namespace kms +{ + +class MappedBuffer { +public: + MappedBuffer() + { + } + + virtual ~MappedBuffer() + { + } + + virtual uint32_t width() const = 0; + virtual uint32_t height() const = 0; + + virtual PixelFormat format() const = 0; + virtual unsigned num_planes() const = 0; + + virtual uint32_t stride(unsigned plane) const = 0; + virtual uint32_t size(unsigned plane) const = 0; + virtual uint32_t offset(unsigned plane) const = 0; + virtual uint8_t* map(unsigned plane) = 0; +}; + +class MappedDumbBuffer : public MappedBuffer { +public: + MappedDumbBuffer(DumbFramebuffer& dumbfb) + : m_fb(dumbfb) + { + + } + + virtual ~MappedDumbBuffer() + { + + } + + uint32_t width() const { return m_fb.width(); } + uint32_t height() const { return m_fb.height(); } + + PixelFormat format() const { return m_fb.format(); } + unsigned num_planes() const { return m_fb.num_planes(); } + + uint32_t stride(unsigned plane) const { return m_fb.stride(plane); } + uint32_t size(unsigned plane) const { return m_fb.size(plane); } + uint32_t offset(unsigned plane) const { return m_fb.offset(plane); } + uint8_t* map(unsigned plane) { return m_fb.map(plane); } + +private: + DumbFramebuffer& m_fb; +}; + +class MappedCPUBuffer : public MappedBuffer { +public: + MappedCPUBuffer(uint32_t width, uint32_t height, PixelFormat format); + + virtual ~MappedCPUBuffer(); + + MappedCPUBuffer(const MappedCPUBuffer& other) = delete; + MappedCPUBuffer& operator=(const MappedCPUBuffer& other) = delete; + + uint32_t width() const { return m_width; } + uint32_t height() const { return m_height; } + + PixelFormat format() const { return m_format; } + unsigned num_planes() const { return m_num_planes; } + + uint32_t stride(unsigned plane) const { return m_planes[plane].stride; } + uint32_t size(unsigned plane) const { return m_planes[plane].size; } + uint32_t offset(unsigned plane) const { return m_planes[plane].offset; } + uint8_t* map(unsigned plane) { return m_planes[plane].map; } + + +private: + struct FramebufferPlane { + uint32_t size; + uint32_t stride; + uint32_t offset; + uint8_t *map; + }; + + uint32_t m_width; + uint32_t m_height; + PixelFormat m_format; + + unsigned m_num_planes; + struct FramebufferPlane m_planes[4]; +}; + +} |