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

Reply via email to