VideoCommon: Change PokeEFB to take a pointer rather than a vector
This saves allocating a vector for the pass-through path.
This commit is contained in:
parent
7b628c99ec
commit
a61fc372bb
|
@ -474,21 +474,11 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data)
|
||||||
else if (alpha_read_mode.ReadMode == 1) return (ret | 0xFF000000); // GX_READ_FF
|
else if (alpha_read_mode.ReadMode == 1) return (ret | 0xFF000000); // GX_READ_FF
|
||||||
else /*if(alpha_read_mode.ReadMode == 0)*/ return (ret & 0x00FFFFFF); // GX_READ_00
|
else /*if(alpha_read_mode.ReadMode == 0)*/ return (ret & 0x00FFFFFF); // GX_READ_00
|
||||||
}
|
}
|
||||||
else // if (type == POKE_COLOR || type == POKE_Z)
|
|
||||||
{
|
|
||||||
std::vector<EfbPokeData> vector;
|
|
||||||
EfbPokeData d;
|
|
||||||
d.x = x;
|
|
||||||
d.y = y;
|
|
||||||
d.data = poke_data;
|
|
||||||
vector.push_back(d);
|
|
||||||
PokeEFB(type, vector);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data)
|
void Renderer::PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points)
|
||||||
{
|
{
|
||||||
ResetAPIState();
|
ResetAPIState();
|
||||||
|
|
||||||
|
@ -513,7 +503,7 @@ void Renderer::PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data)
|
||||||
FramebufferManager::GetEFBDepthTexture()->GetDSV());
|
FramebufferManager::GetEFBDepthTexture()->GetDSV());
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D::DrawEFBPokeQuads(type, data.data(), data.size());
|
D3D::DrawEFBPokeQuads(type, points, num_points);
|
||||||
|
|
||||||
if (type == POKE_Z)
|
if (type == POKE_Z)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,7 +37,7 @@ public:
|
||||||
void RenderText(const std::string& text, int left, int top, u32 color) override;
|
void RenderText(const std::string& text, int left, int top, u32 color) override;
|
||||||
|
|
||||||
u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override;
|
u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override;
|
||||||
void PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data) override;
|
void PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points) override;
|
||||||
|
|
||||||
u16 BBoxRead(int index) override;
|
u16 BBoxRead(int index) override;
|
||||||
void BBoxWrite(int index, u16 value) override;
|
void BBoxWrite(int index, u16 value) override;
|
||||||
|
|
|
@ -643,7 +643,7 @@ void FramebufferManager::GetTargetSize(unsigned int *width, unsigned int *height
|
||||||
*height = m_targetHeight;
|
*height = m_targetHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramebufferManager::PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data)
|
void FramebufferManager::PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points)
|
||||||
{
|
{
|
||||||
g_renderer->ResetAPIState();
|
g_renderer->ResetAPIState();
|
||||||
|
|
||||||
|
@ -657,10 +657,10 @@ void FramebufferManager::PokeEFB(EFBAccessType type, const std::vector<EfbPokeDa
|
||||||
|
|
||||||
glBindVertexArray(m_EfbPokes_VAO);
|
glBindVertexArray(m_EfbPokes_VAO);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, m_EfbPokes_VBO);
|
glBindBuffer(GL_ARRAY_BUFFER, m_EfbPokes_VBO);
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(EfbPokeData) * data.size(), data.data(), GL_STREAM_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, sizeof(EfbPokeData) * num_points, points, GL_STREAM_DRAW);
|
||||||
m_EfbPokes.Bind();
|
m_EfbPokes.Bind();
|
||||||
glViewport(0, 0, m_targetWidth, m_targetHeight);
|
glViewport(0, 0, m_targetWidth, m_targetHeight);
|
||||||
glDrawArrays(GL_POINTS, 0, (GLsizei)data.size());
|
glDrawArrays(GL_POINTS, 0, (GLsizei)num_points);
|
||||||
|
|
||||||
g_renderer->RestoreAPIState();
|
g_renderer->RestoreAPIState();
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ public:
|
||||||
// convtype=0 -> rgb8->rgba6, convtype=2 -> rgba6->rgb8
|
// convtype=0 -> rgb8->rgba6, convtype=2 -> rgba6->rgb8
|
||||||
static void ReinterpretPixelData(unsigned int convtype);
|
static void ReinterpretPixelData(unsigned int convtype);
|
||||||
|
|
||||||
static void PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data);
|
static void PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers) override;
|
XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers) override;
|
||||||
|
|
|
@ -944,19 +944,6 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case POKE_COLOR:
|
|
||||||
case POKE_Z:
|
|
||||||
{
|
|
||||||
std::vector<EfbPokeData> vector;
|
|
||||||
EfbPokeData d;
|
|
||||||
d.x = x;
|
|
||||||
d.y = y;
|
|
||||||
d.data = poke_data;
|
|
||||||
vector.push_back(d);
|
|
||||||
PokeEFB(type, vector);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -964,9 +951,9 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data)
|
void Renderer::PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points)
|
||||||
{
|
{
|
||||||
FramebufferManager::PokeEFB(type, data);
|
FramebufferManager::PokeEFB(type, points, num_points);
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 Renderer::BBoxRead(int index)
|
u16 Renderer::BBoxRead(int index)
|
||||||
|
|
|
@ -87,7 +87,7 @@ public:
|
||||||
void FlipImageData(u8 *data, int w, int h, int pixel_width = 3);
|
void FlipImageData(u8 *data, int w, int h, int pixel_width = 3);
|
||||||
|
|
||||||
u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override;
|
u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override;
|
||||||
void PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data) override;
|
void PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points) override;
|
||||||
|
|
||||||
u16 BBoxRead(int index) override;
|
u16 BBoxRead(int index) override;
|
||||||
void BBoxWrite(int index, u16 value) override;
|
void BBoxWrite(int index, u16 value) override;
|
||||||
|
|
|
@ -44,7 +44,7 @@ void AsyncRequests::PullEventsInternal()
|
||||||
} while(!m_queue.empty() && m_queue.front().type == first_event.type);
|
} while(!m_queue.empty() && m_queue.front().type == first_event.type);
|
||||||
|
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
g_renderer->PokeEFB(t, m_merged_efb_pokes);
|
g_renderer->PokeEFB(t, m_merged_efb_pokes.data(), m_merged_efb_pokes.size());
|
||||||
lock.lock();
|
lock.lock();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -109,11 +109,17 @@ void AsyncRequests::HandleEvent(const AsyncRequests::Event& e)
|
||||||
switch (e.type)
|
switch (e.type)
|
||||||
{
|
{
|
||||||
case Event::EFB_POKE_COLOR:
|
case Event::EFB_POKE_COLOR:
|
||||||
g_renderer->AccessEFB(POKE_COLOR, e.efb_poke.x, e.efb_poke.y, e.efb_poke.data);
|
{
|
||||||
|
EfbPokeData poke = { e.efb_poke.x, e.efb_poke.y, e.efb_poke.data };
|
||||||
|
g_renderer->PokeEFB(POKE_COLOR, &poke, 1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Event::EFB_POKE_Z:
|
case Event::EFB_POKE_Z:
|
||||||
g_renderer->AccessEFB(POKE_Z, e.efb_poke.x, e.efb_poke.y, e.efb_poke.data);
|
{
|
||||||
|
EfbPokeData poke = { e.efb_poke.x, e.efb_poke.y, e.efb_poke.data };
|
||||||
|
g_renderer->PokeEFB(POKE_Z, &poke, 1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Event::EFB_PEEK_COLOR:
|
case Event::EFB_PEEK_COLOR:
|
||||||
|
|
|
@ -617,10 +617,3 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const
|
||||||
XFBWrited = false;
|
XFBWrited = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data)
|
|
||||||
{
|
|
||||||
for (EfbPokeData poke : data)
|
|
||||||
{
|
|
||||||
AccessEFB(type, poke.x, poke.y, poke.data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ public:
|
||||||
static void RenderToXFB(u32 xfbAddr, const EFBRectangle& sourceRc, u32 fbStride, u32 fbHeight, float Gamma = 1.0f);
|
static void RenderToXFB(u32 xfbAddr, const EFBRectangle& sourceRc, u32 fbStride, u32 fbHeight, float Gamma = 1.0f);
|
||||||
|
|
||||||
virtual u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) = 0;
|
virtual u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) = 0;
|
||||||
virtual void PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data);
|
virtual void PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points) = 0;
|
||||||
|
|
||||||
virtual u16 BBoxRead(int index) = 0;
|
virtual u16 BBoxRead(int index) = 0;
|
||||||
virtual void BBoxWrite(int index, u16 value) = 0;
|
virtual void BBoxWrite(int index, u16 value) = 0;
|
||||||
|
|
Loading…
Reference in New Issue