Andreas Sandberg has uploaded this change for review. (
https://gem5-review.googlesource.com/10804
Change subject: base: Add more pixel converters
......................................................................
base: Add more pixel converters
Add pixel converters for common color formats. These will be used by
the new Mali compliant display processor.
Change-Id: I6a06e7521e804f78514ce1194ae342979013c7ac
Signed-off-by: Andreas Sandberg <[email protected]>
---
M src/base/pixel.cc
M src/base/pixel.hh
M src/base/pixeltest.cc
M src/dev/arm/hdlcd.cc
M src/dev/arm/pl111.cc
5 files changed, 107 insertions(+), 53 deletions(-)
diff --git a/src/base/pixel.cc b/src/base/pixel.cc
index 31dfa2c..bc02e3b 100644
--- a/src/base/pixel.cc
+++ b/src/base/pixel.cc
@@ -43,16 +43,39 @@
#include "base/bitfield.hh"
-template<typename Type>
-const PixelConverter8b PixelConverter<Type>::rgba8888_le(4, 0, 8, 16, 8,
8, 8);
-template<typename Type>
-const PixelConverter8b PixelConverter<Type>::rgba8888_be(4, 0, 8, 16, 8,
8, 8,
- BigEndianByteOrder);
-template<typename Type>
-const PixelConverter8b PixelConverter<Type>::rgb565_le(2, 0, 5, 11, 5, 6,
5);
-template<typename Type>
-const PixelConverter8b PixelConverter<Type>::rgb565_be(2, 0, 5, 11, 5, 6,
5,
- BigEndianByteOrder);
+namespace PixelConverters {
+
+namespace LE {
+const PixelConverter8b rgba8888(4,0,8,16,8,8,8);
+const PixelConverter8b argb8888(4,16,8,0,8,8,8);
+const PixelConverter8b abgr8888(4,0,8,16,8,8,8);
+const PixelConverter8b bgra8888(4,8,16,24,8,8,8);
+const PixelConverter8b xrgb8888(4,16,8,0,8,8,8);
+const PixelConverter8b xbgr8888(4,0,8,16,8,8,8);
+const PixelConverter8b rgbx8888(4,16,8,0,8,8,8);
+const PixelConverter8b bgrx8888(4,0,8,16,8,8,8);
+
+const PixelConverter8b rgb888(3,0,8,16,8,8,8);
+const PixelConverter8b bgr888(3,16,8,0,8,8,8);
+
+const PixelConverter8b rgba5551(2,11,2,1,5,5,5);
+const PixelConverter8b abgr1555(2,0,5,10,5,5,5);
+const PixelConverter8b rgb565(2,0,5,11,5,6,5);
+const PixelConverter8b bgr565(2,0,5,11,5,6,5);
+
+const PixelConverter16b argb2101010(4,20,10,0,10,10,10);
+const PixelConverter16b abgr2101010(4,0,10,20,10,10,10);
+const PixelConverter16b rgba1010102(4,22,12,2,10,10,10);
+const PixelConverter16b bgra1010102(4,2,12,22,10,10,10);
+};
+
+namespace BE {
+const PixelConverter8b rgba8888(4, 0, 8, 16, 8, 8, 8, BigEndianByteOrder);
+const PixelConverter8b rgb565(2, 0, 5, 11, 5, 6, 5, BigEndianByteOrder);
+};
+
+};
+
template<typename Type>
PixelConverter<Type>::PixelConverter(unsigned _length,
unsigned ro, unsigned go, unsigned bo,
diff --git a/src/base/pixel.hh b/src/base/pixel.hh
index 3d75a2b..319724a 100644
--- a/src/base/pixel.hh
+++ b/src/base/pixel.hh
@@ -178,7 +178,6 @@
* the word (i.e., it is possible to shift and mask out a contiguous
* bit range for each pixel).
*/
-
template<typename Type>
class PixelConverter
{
@@ -295,25 +294,57 @@
Channel ch_g;
/** Blue channel conversion helper */
Channel ch_b;
-
- /** Predefined 32-bit RGB (red in least significant bits, 8
- * bits/channel, little endian) conversion helper */
- static const PixelConverter<uint8_t> rgba8888_le;
- /** Predefined 16-bit RGB565 (red in least significant bits,
- * little endian) conversion helper */
- static const PixelConverter<uint8_t> rgb565_le;
-
- /** Predefined 32-bit RGB (red in least significant bits, 8
- * bits/channel, big endian) conversion helper */
- static const PixelConverter<uint8_t> rgba8888_be;
- /** Predefined 16-bit RGB565 (red in least significant bits,
- * big endian) conversion helper */
- static const PixelConverter<uint8_t> rgb565_be;
};
typedef PixelConverter<uint8_t> PixelConverter8b;
typedef PixelConverter<uint16_t> PixelConverter16b;
+/** Well-known pixel formats */
+namespace PixelConverters {
+namespace LE {
+
+/** Predefined 32-bit RGB (red in least significant bits, 8
+ * bits/channel, little endian) conversion helper */
+extern const PixelConverter8b rgba8888;
+extern const PixelConverter8b argb8888;
+extern const PixelConverter8b abgr8888;
+extern const PixelConverter8b bgra8888;
+
+extern const PixelConverter8b xrgb8888;
+extern const PixelConverter8b xbgr8888;
+extern const PixelConverter8b rgbx8888;
+extern const PixelConverter8b bgrx8888;
+
+extern const PixelConverter8b rgb888;
+extern const PixelConverter8b bgr888;
+
+extern const PixelConverter8b rgba5551;
+extern const PixelConverter8b abgr1555;
+/** Predefined 16-bit RGB565 (red in least significant bits,
+ * little endian) conversion helper */
+extern const PixelConverter8b rgb565;
+extern const PixelConverter8b bgr565;
+
+extern const PixelConverter16b argb2101010;
+extern const PixelConverter16b abgr2101010;
+extern const PixelConverter16b rgba1010102;
+extern const PixelConverter16b bgra1010102;
+
+}; // PixelConverters::LE
+
+namespace BE {
+ /** Predefined 32-bit RGB (red in least significant bits, 8
+ * bits/channel, big endian) conversion helper */
+ extern const PixelConverter8b rgba8888;
+
+ /** Predefined 16-bit RGB565 (red in least significant bits,
+ * big endian) conversion helper */
+ extern const PixelConverter8b rgb565;
+}; // PixelConverters::BE
+
+}; // PixelConverters
+
+
inline bool
to_number(const std::string &value, PixelU8 &retval)
{
@@ -321,14 +352,14 @@
if (!to_number(value, num))
return false;
- retval = PixelConverter8b::rgba8888_le.toPixel(num);
+ retval = PixelConverters::LE::rgba8888.toPixel(num);
return true;
}
inline std::ostream &
operator<<(std::ostream &os, const PixelU8 &pxl)
{
- os << csprintf("0x%.08x",
PixelConverter8b::rgba8888_le.fromPixel(pxl));
+ os << csprintf("0x%.08x",
PixelConverters::LE::rgba8888.fromPixel(pxl));
return os;
}
diff --git a/src/base/pixeltest.cc b/src/base/pixeltest.cc
index 46ce161..44e1cce 100644
--- a/src/base/pixeltest.cc
+++ b/src/base/pixeltest.cc
@@ -47,55 +47,55 @@
TEST(FBTest, PixelConversionRGBA8888)
{
- EXPECT_EQ(PixelConverter8b::rgba8888_le.fromPixel(pixel_red),
+ EXPECT_EQ(PixelConverters::LE::rgba8888.fromPixel(pixel_red),
0x000000ffU);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.fromPixel(pixel_green),
+ EXPECT_EQ(PixelConverters::LE::rgba8888.fromPixel(pixel_green),
0x0000ff00U);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.fromPixel(pixel_blue),
+ EXPECT_EQ(PixelConverters::LE::rgba8888.fromPixel(pixel_blue),
0x00ff0000U);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.toPixel(0x000000ffU),
+ EXPECT_EQ(PixelConverters::LE::rgba8888.toPixel(0x000000ffU),
pixel_red);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.toPixel(0x0000ff00U),
+ EXPECT_EQ(PixelConverters::LE::rgba8888.toPixel(0x0000ff00U),
pixel_green);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.toPixel(0x00ff0000U),
+ EXPECT_EQ(PixelConverters::LE::rgba8888.toPixel(0x00ff0000U),
pixel_blue);
}
TEST(FBTest, PixelConversionRGB565)
{
- EXPECT_EQ(PixelConverter8b::rgb565_le.fromPixel(pixel_red), 0x001fU);
- EXPECT_EQ(PixelConverter8b::rgb565_le.fromPixel(pixel_green), 0x07e0U);
- EXPECT_EQ(PixelConverter8b::rgb565_le.fromPixel(pixel_blue), 0xf800U);
+ EXPECT_EQ(PixelConverters::LE::rgb565.fromPixel(pixel_red), 0x001fU);
+ EXPECT_EQ(PixelConverters::LE::rgb565.fromPixel(pixel_green), 0x07e0U);
+ EXPECT_EQ(PixelConverters::LE::rgb565.fromPixel(pixel_blue), 0xf800U);
- EXPECT_EQ(PixelConverter8b::rgb565_le.toPixel(0x001fU), pixel_red);
- EXPECT_EQ(PixelConverter8b::rgb565_le.toPixel(0x07e0U), pixel_green);
- EXPECT_EQ(PixelConverter8b::rgb565_le.toPixel(0xf800U), pixel_blue);
+ EXPECT_EQ(PixelConverters::LE::rgb565.toPixel(0x001fU), pixel_red);
+ EXPECT_EQ(PixelConverters::LE::rgb565.toPixel(0x07e0U), pixel_green);
+ EXPECT_EQ(PixelConverters::LE::rgb565.toPixel(0xf800U), pixel_blue);
}
TEST(FBTest, PixelToMemRGBA8888LE)
{
uint8_t data[] = { 0xde, 0xad, 0xbe, 0xef };
- PixelConverter8b::rgba8888_le.fromPixel(data, pixel_red);
+ PixelConverters::LE::rgba8888.fromPixel(data, pixel_red);
EXPECT_EQ(data[0], 0xff);
EXPECT_EQ(data[1], 0x00);
EXPECT_EQ(data[3], 0x00);
EXPECT_EQ(data[3], 0x00);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.toPixel(data), pixel_red);
+ EXPECT_EQ(PixelConverters::LE::rgba8888.toPixel(data), pixel_red);
- PixelConverter8b::rgba8888_le.fromPixel(data, pixel_green);
+ PixelConverters::LE::rgba8888.fromPixel(data, pixel_green);
EXPECT_EQ(data[0], 0x00);
EXPECT_EQ(data[1], 0xff);
EXPECT_EQ(data[3], 0x00);
EXPECT_EQ(data[3], 0x00);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.toPixel(data), pixel_green);
+ EXPECT_EQ(PixelConverters::LE::rgba8888.toPixel(data), pixel_green);
- PixelConverter8b::rgba8888_le.fromPixel(data, pixel_blue);
+ PixelConverters::LE::rgba8888.fromPixel(data, pixel_blue);
EXPECT_EQ(data[0], 0x00);
EXPECT_EQ(data[1], 0x00);
EXPECT_EQ(data[2], 0xff);
EXPECT_EQ(data[3], 0x00);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.toPixel(data), pixel_blue);
+ EXPECT_EQ(PixelConverters::LE::rgba8888.toPixel(data), pixel_blue);
}
TEST(FBTest, MemToPixelRGBA8888LE)
@@ -104,9 +104,9 @@
uint8_t green[] = { 0x00, 0xff, 0x00, 0x00 };
uint8_t blue[] = { 0x00, 0x00, 0xff, 0x00 };
- EXPECT_EQ(PixelConverter8b::rgba8888_le.toPixel(red), pixel_red);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.toPixel(green), pixel_green);
- EXPECT_EQ(PixelConverter8b::rgba8888_le.toPixel(blue), pixel_blue);
+ EXPECT_EQ(PixelConverters::LE::rgba8888.toPixel(red), pixel_red);
+ EXPECT_EQ(PixelConverters::LE::rgba8888.toPixel(green), pixel_green);
+ EXPECT_EQ(PixelConverters::LE::rgba8888.toPixel(blue), pixel_blue);
}
TEST(FBTest, MemToPixelRGBA8888BE)
@@ -115,7 +115,7 @@
uint8_t green[] = { 0x00, 0x00, 0xff, 0x00 };
uint8_t blue[] = { 0x00, 0xff, 0x00, 0x00 };
- EXPECT_EQ(PixelConverter8b::rgba8888_be.toPixel(red), pixel_red);
- EXPECT_EQ(PixelConverter8b::rgba8888_be.toPixel(green), pixel_green);
- EXPECT_EQ(PixelConverter8b::rgba8888_be.toPixel(blue), pixel_blue);
+ EXPECT_EQ(PixelConverters::BE::rgba8888.toPixel(red), pixel_red);
+ EXPECT_EQ(PixelConverters::BE::rgba8888.toPixel(green), pixel_green);
+ EXPECT_EQ(PixelConverters::BE::rgba8888.toPixel(blue), pixel_blue);
}
diff --git a/src/dev/arm/hdlcd.cc b/src/dev/arm/hdlcd.cc
index d75e6b8..e808f19 100644
--- a/src/dev/arm/hdlcd.cc
+++ b/src/dev/arm/hdlcd.cc
@@ -87,7 +87,7 @@
virtRefreshEvent([this]{ virtRefresh(); }, name()),
// Other
imgFormat(p->frame_format), pic(NULL),
- conv(PixelConverter8b::rgba8888_le),
+ conv(PixelConverters::LE::rgba8888),
pixelPump(*this, *p->pxl_clk, p->pixel_chunk)
{
if (vnc)
diff --git a/src/dev/arm/pl111.cc b/src/dev/arm/pl111.cc
index 729a25f..5417968 100644
--- a/src/dev/arm/pl111.cc
+++ b/src/dev/arm/pl111.cc
@@ -64,7 +64,7 @@
clcdCrsrPalette1(0), clcdCrsrXY(0), clcdCrsrClip(0), clcdCrsrImsc(0),
clcdCrsrIcr(0), clcdCrsrRis(0), clcdCrsrMis(0),
pixelClock(p->pixel_clock),
- converter(PixelConverter8b::rgba8888_le), fb(LcdMaxWidth,
LcdMaxHeight),
+ converter(PixelConverters::LE::rgba8888), fb(LcdMaxWidth,
LcdMaxHeight),
vnc(p->vnc), bmp(&fb), pic(NULL),
width(LcdMaxWidth), height(LcdMaxHeight),
bytesPerPixel(4), startTime(0), startAddr(0), maxAddr(0), curAddr(0),
--
To view, visit https://gem5-review.googlesource.com/10804
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I6a06e7521e804f78514ce1194ae342979013c7ac
Gerrit-Change-Number: 10804
Gerrit-PatchSet: 1
Gerrit-Owner: Andreas Sandberg <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev