2c2
< * Copyright (c) 2010-2013 ARM Limited
---
> * Copyright (c) 2010-2013, 2015 ARM Limited
39a40,41
> #include "dev/arm/hdlcd.hh"
>
41d42
< #include "base/bitmap.hh"
48d48
< #include "dev/arm/hdlcd.hh"
66c66,67
< pixelClock(p->pixel_clock), vnc(p->vnc), bmp(NULL), pic(NULL),
---
> pixelClock(p->pixel_clock),
> fb(0, 0), vnc(p->vnc), bmp(&fb), pic(NULL),
69c70
< frameUnderrun(false), virtualDisplayBuffer(NULL), pixelBufferSize(0),
---
> frameUnderrun(false), pixelBufferSize(0),
84c85
< vnc->setFramebufferAddr(NULL);
---
> vnc->setFrameBuffer(&fb);
89,90d89
< if (virtualDisplayBuffer)
< delete [] virtualDisplayBuffer;
318,319c317
< const uint16_t bpp = bytesPerPixel() << 3;
< const size_t buffer_size = bytesPerPixel() * width() * height();
---
> const uint16_t bpp M5_VAR_USED = bytesPerPixel() << 3;
320a319,325
> // Workaround configuration bugs where multiple display
> // controllers are attached to the same VNC server by reattaching
> // enabled devices. This isn't ideal, but works as long as only
> // one display controller is active at a time.
> if (command.enable && vnc)
> vnc->setFrameBuffer(&fb);
>
331,335d335
< if (virtualDisplayBuffer)
< delete [] virtualDisplayBuffer;
< virtualDisplayBuffer = new uint8_t[buffer_size];
< memset(virtualDisplayBuffer, 0, buffer_size);
< }
337,339c337,339
< assert(virtualDisplayBuffer);
< if (vnc)
< vnc->setFramebufferAddr(virtualDisplayBuffer);
---
> virtualDisplayBuffer.resize(bytesPerPixel() * area());
> fb.resize(width(), height());
> fb.clear();
341,342c341,343
< if (bmp)
< delete bmp;
---
> std::fill(virtualDisplayBuffer.begin(), virtualDisplayBuffer.end(),
> 0);
> }
357c358
< fps * buffer_size / 1024 / 1024,
---
> fps * virtualDisplayBuffer.size() / 1024 / 1024,
362,411d362
<
< if (pixel_format.big_endian)
< panic("Big Endian pixel format not implemented by HDLcd controller");
<
< if (vnc) {
< if ((bpp == 24) &&
< (red_select.size == 8) &&
< (blue_select.size == 8) &&
< (green_select.size == 8) &&
< (green_select.offset == 8)) {
< if ((blue_select.offset == 0) &&
< (red_select.offset == 16)) {
< vnc->setFrameBufferParams(VideoConvert::rgb8888, width(),
< height());
< bmp = new Bitmap(VideoConvert::rgb8888, width(), height(),
< virtualDisplayBuffer);
< DPRINTF(HDLcd, "color mode: rgb888\n");
< } else if ((red_select.offset == 0) &&
< (blue_select.offset == 16)) {
< vnc->setFrameBufferParams(VideoConvert::bgr8888, width(),
< height());
< bmp = new Bitmap(VideoConvert::bgr8888, width(), height(),
< virtualDisplayBuffer);
< DPRINTF(HDLcd, "color mode: bgr888\n");
< }
< } else if ((bpp == 16) &&
< (red_select.size == 5) &&
< (blue_select.size == 5) &&
< (green_select.size == 6) &&
< (green_select.offset == 5)) {
< if ((blue_select.offset == 0) &&
< (red_select.offset == 11)) {
< vnc->setFrameBufferParams(VideoConvert::rgb565, width(),
< height());
< bmp = new Bitmap(VideoConvert::rgb565, width(), height(),
< virtualDisplayBuffer);
< DPRINTF(HDLcd, "color mode: rgb565\n");
< } else if ((red_select.offset == 0) &&
< (blue_select.offset == 11)) {
< vnc->setFrameBufferParams(VideoConvert::bgr565, width(),
< height());
< bmp = new Bitmap(VideoConvert::bgr565, width(), height(),
< virtualDisplayBuffer);
< DPRINTF(HDLcd, "color mode: bgr565\n");
< }
< } else {
< DPRINTF(HDLcd, "color mode: undefined\n");
< panic("Unimplemented video mode\n");
< }
< }
427c378
< assert(virtualDisplayBuffer);
---
> assert(!virtualDisplayBuffer.empty());
486a438,439
> uint8_t *const dma_dst(
> virtualDisplayBuffer.data() + dmaCurAddr - dmaStartAddr);
489,490c442
< virtualDisplayBuffer + dmaCurAddr - dmaStartAddr,
< 0, Request::UNCACHEABLE);
---
> dma_dst, 0, Request::UNCACHEABLE);
551a504,513
> PixelConverter
> HDLcd::pixelConverter() const
> {
> return PixelConverter(
> bytesPerPixel(),
> red_select.offset, green_select.offset, blue_select.offset,
> red_select.size, green_select.size, blue_select.size,
> pixel_format.big_endian ? BigEndianByteOrder : LittleEndianByteOrder);
> }
>
558a521,522
> fb.copyIn(virtualDisplayBuffer, pixelConverter());
>
566d529
< assert(bmp);
569c532
< bmp->write(pic);
---
> bmp.write(*pic);
667,668c630
< const size_t buffer_size = bytesPerPixel() * width() * height();
< SERIALIZE_ARRAY(virtualDisplayBuffer, buffer_size);
---
> arrayParamOut(os, "virtualDisplayBuffer", virtualDisplayBuffer);
780,782c742
< const size_t buffer_size = bytesPerPixel() * width() * height();
< virtualDisplayBuffer = new uint8_t[buffer_size];
< UNSERIALIZE_ARRAY(virtualDisplayBuffer, buffer_size);
---
> arrayParamIn(cp, section, "virtualDisplayBuffer", virtualDisplayBuffer);
825a786,787
> fb.resize(width(), height());
> fb.copyIn(virtualDisplayBuffer, pixelConverter());