implement display capture for compute renderer
it's actually just all stolen from the regular OpenGL renderer
This commit is contained in:
parent
91bea108ea
commit
5984c78588
|
@ -367,7 +367,7 @@ void SoftRenderer::VBlankEnd(Unit* unitA, Unit* unitB)
|
||||||
{
|
{
|
||||||
if ((unitA->CaptureCnt & (1<<31)) && (((unitA->CaptureCnt >> 29) & 0x3) != 1))
|
if ((unitA->CaptureCnt & (1<<31)) && (((unitA->CaptureCnt >> 29) & 0x3) != 1))
|
||||||
{
|
{
|
||||||
//reinterpret_cast<GPU3D::GLRenderer*>(GPU3D::CurrentRenderer.get())->PrepareCaptureFrame();
|
reinterpret_cast<GPU3D::GLRenderer*>(GPU3D::CurrentRenderer.get())->PrepareCaptureFrame();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -158,8 +158,10 @@ public:
|
||||||
virtual u32* GetLine(int line) = 0;
|
virtual u32* GetLine(int line) = 0;
|
||||||
|
|
||||||
virtual void SetupAccelFrame() {}
|
virtual void SetupAccelFrame() {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Renderer3D(bool Accelerated);
|
Renderer3D(bool Accelerated);
|
||||||
|
virtual void PrepareCaptureFrame() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int Renderer;
|
extern int Renderer;
|
||||||
|
|
|
@ -154,12 +154,15 @@ bool ComputeRenderer::Init()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glGenBuffers(1, &PixelBuffer);
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelBuffer);
|
||||||
|
glBufferData(GL_PIXEL_PACK_BUFFER, 256*192*4, NULL, GL_DYNAMIC_READ);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ComputeRenderer::DeInit()
|
void ComputeRenderer::DeInit()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ComputeRenderer::Reset()
|
void ComputeRenderer::Reset()
|
||||||
|
@ -1395,7 +1398,26 @@ void ComputeRenderer::RestartFrame()
|
||||||
|
|
||||||
u32* ComputeRenderer::GetLine(int line)
|
u32* ComputeRenderer::GetLine(int line)
|
||||||
{
|
{
|
||||||
return DummyLine;
|
int stride = 256;
|
||||||
|
|
||||||
|
if (line == 0)
|
||||||
|
{
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelBuffer);
|
||||||
|
u8* data = (u8*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
|
||||||
|
if (data) memcpy(&FramebufferCPU[0], data, 4*stride*192);
|
||||||
|
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
|
||||||
|
}
|
||||||
|
|
||||||
|
u64* ptr = (u64*)&FramebufferCPU[stride * line];
|
||||||
|
for (int i = 0; i < stride; i+=2)
|
||||||
|
{
|
||||||
|
u64 rgb = *ptr & 0x00FCFCFC00FCFCFC;
|
||||||
|
u64 a = *ptr & 0xF8000000F8000000;
|
||||||
|
|
||||||
|
*ptr++ = (rgb >> 2) | (a >> 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return &FramebufferCPU[stride * line];
|
||||||
}
|
}
|
||||||
|
|
||||||
void ComputeRenderer::SetupAccelFrame()
|
void ComputeRenderer::SetupAccelFrame()
|
||||||
|
@ -1403,4 +1425,11 @@ void ComputeRenderer::SetupAccelFrame()
|
||||||
glBindTexture(GL_TEXTURE_2D, Framebuffer);
|
glBindTexture(GL_TEXTURE_2D, Framebuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ComputeRenderer::PrepareCaptureFrame()
|
||||||
|
{
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelBuffer);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, Framebuffer);
|
||||||
|
glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_BYTE, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -49,6 +49,7 @@ public:
|
||||||
u32* GetLine(int line) override;
|
u32* GetLine(int line) override;
|
||||||
|
|
||||||
void SetupAccelFrame() override;
|
void SetupAccelFrame() override;
|
||||||
|
void PrepareCaptureFrame() override;
|
||||||
private:
|
private:
|
||||||
GLuint ShaderInterpXSpans[2];
|
GLuint ShaderInterpXSpans[2];
|
||||||
GLuint ShaderBinCombined;
|
GLuint ShaderBinCombined;
|
||||||
|
@ -240,6 +241,9 @@ private:
|
||||||
u32 TextureDecodingBuffer[1024*1024];
|
u32 TextureDecodingBuffer[1024*1024];
|
||||||
|
|
||||||
GLuint Framebuffer;
|
GLuint Framebuffer;
|
||||||
|
GLuint PixelBuffer;
|
||||||
|
|
||||||
|
u32 FramebufferCPU[256*192];
|
||||||
|
|
||||||
TexCacheEntry& GetTexture(u32 textureParam, u32 paletteParam);
|
TexCacheEntry& GetTexture(u32 textureParam, u32 paletteParam);
|
||||||
|
|
||||||
|
|
|
@ -1278,6 +1278,7 @@ void GLRenderer::PrepareCaptureFrame()
|
||||||
glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
||||||
glBlitFramebuffer(0, 0, ScreenW, ScreenH, 0, 0, 256, 192, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
glBlitFramebuffer(0, 0, ScreenW, ScreenH, 0, 0, 256, 192, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||||
|
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelbufferID);
|
||||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, DownscaleFramebuffer);
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, DownscaleFramebuffer);
|
||||||
glReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
|
glReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
|
||||||
}
|
}
|
||||||
|
@ -1288,6 +1289,7 @@ u32* GLRenderer::GetLine(int line)
|
||||||
|
|
||||||
if (line == 0)
|
if (line == 0)
|
||||||
{
|
{
|
||||||
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelbufferID);
|
||||||
u8* data = (u8*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
|
u8* data = (u8*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
|
||||||
if (data) memcpy(&Framebuffer[stride*0], data, 4*stride*192);
|
if (data) memcpy(&Framebuffer[stride*0], data, 4*stride*192);
|
||||||
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
|
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
|
||||||
|
|
|
@ -40,6 +40,8 @@ public:
|
||||||
void SetupAccelFrame() override;
|
void SetupAccelFrame() override;
|
||||||
void PrepareCaptureFrame();
|
void PrepareCaptureFrame();
|
||||||
|
|
||||||
|
void PrepareCaptureFrame() override;
|
||||||
|
|
||||||
static std::unique_ptr<GLRenderer> New() noexcept;
|
static std::unique_ptr<GLRenderer> New() noexcept;
|
||||||
private:
|
private:
|
||||||
// Used by New()
|
// Used by New()
|
||||||
|
|
Loading…
Reference in New Issue