mirror of https://github.com/PCSX2/pcsx2.git
Common: Remove AlignedBuffer
And replace its one use site (texture dumping).
This commit is contained in:
parent
6beaec8ba1
commit
732aa96656
|
@ -42,116 +42,3 @@ extern void _aligned_free(void* pmem);
|
||||||
#define pcsx2_aligned_realloc(handle, new_size, align, old_size) \
|
#define pcsx2_aligned_realloc(handle, new_size, align, old_size) \
|
||||||
_aligned_realloc(handle, new_size, align)
|
_aligned_realloc(handle, new_size, align)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------------
|
|
||||||
// AlignedBuffer
|
|
||||||
// --------------------------------------------------------------------------------------
|
|
||||||
// A simple container class for an aligned allocation. By default, no bounds checking is
|
|
||||||
// performed, and there is no option for enabling bounds checking. If bounds checking and
|
|
||||||
// other features are needed, use the more robust SafeArray<> instead.
|
|
||||||
//
|
|
||||||
template <typename T, uint align>
|
|
||||||
class AlignedBuffer
|
|
||||||
{
|
|
||||||
static_assert(std::is_pod<T>::value, "Must use a POD type");
|
|
||||||
|
|
||||||
struct Deleter
|
|
||||||
{
|
|
||||||
void operator()(T* ptr)
|
|
||||||
{
|
|
||||||
_aligned_free(ptr);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
std::unique_ptr<T[], Deleter> m_buffer;
|
|
||||||
std::size_t m_size;
|
|
||||||
|
|
||||||
public:
|
|
||||||
AlignedBuffer(size_t size = 0)
|
|
||||||
{
|
|
||||||
Alloc(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
AlignedBuffer(const AlignedBuffer& copy)
|
|
||||||
{
|
|
||||||
Alloc(copy.m_size);
|
|
||||||
if (copy.m_size > 0)
|
|
||||||
std::memcpy(m_buffer.get(), copy.m_buffer.get(), copy.m_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
AlignedBuffer(AlignedBuffer&& move)
|
|
||||||
: m_buffer(std::move(move.m_buffer))
|
|
||||||
, m_size(move.m_size)
|
|
||||||
{
|
|
||||||
move.m_size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t GetSize() const { return m_size; }
|
|
||||||
size_t GetLength() const { return m_size; }
|
|
||||||
|
|
||||||
void Alloc(size_t newsize)
|
|
||||||
{
|
|
||||||
m_size = newsize;
|
|
||||||
m_buffer.reset();
|
|
||||||
if (!m_size)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_buffer.reset(reinterpret_cast<T*>(_aligned_malloc(this->m_size * sizeof(T), align)));
|
|
||||||
if (!m_buffer)
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Resize(size_t newsize)
|
|
||||||
{
|
|
||||||
m_buffer.reset(reinterpret_cast<T*>(pcsx2_aligned_realloc(m_buffer.release(), newsize * sizeof(T), align, m_size * sizeof(T))));
|
|
||||||
m_size = newsize;
|
|
||||||
|
|
||||||
if (!m_buffer)
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Free()
|
|
||||||
{
|
|
||||||
Alloc(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Makes enough room for the requested size. Existing data in the array is retained.
|
|
||||||
void MakeRoomFor(uint size)
|
|
||||||
{
|
|
||||||
if (size <= m_size)
|
|
||||||
return;
|
|
||||||
Resize(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
AlignedBuffer& operator=(const AlignedBuffer& copy)
|
|
||||||
{
|
|
||||||
Alloc(copy.m_size);
|
|
||||||
if (copy.m_size > 0)
|
|
||||||
std::memcpy(m_buffer.get(), copy.m_buffer.get(), copy.m_size);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
AlignedBuffer& operator=(AlignedBuffer&& move)
|
|
||||||
{
|
|
||||||
m_buffer = std::move(move.m_buffer);
|
|
||||||
m_size = move.m_size;
|
|
||||||
move.m_size = 0;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* GetPtr(uint idx = 0) const
|
|
||||||
{
|
|
||||||
return &m_buffer[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
T& operator[](uint idx)
|
|
||||||
{
|
|
||||||
return m_buffer[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
const T& operator[](uint idx) const
|
|
||||||
{
|
|
||||||
return m_buffer[idx];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
|
@ -668,14 +668,15 @@ void GSTextureReplacements::DumpTexture(const GSTextureCache::HashCacheKey& hash
|
||||||
|
|
||||||
// use per-texture buffer so we can compress the texture asynchronously and not block the GS thread
|
// use per-texture buffer so we can compress the texture asynchronously and not block the GS thread
|
||||||
// must be 32 byte aligned for ReadTexture().
|
// must be 32 byte aligned for ReadTexture().
|
||||||
AlignedBuffer<u8, 32> buffer(pitch * static_cast<u32>(read_height));
|
u8* buffer = static_cast<u8*>(_aligned_malloc(pitch * static_cast<u32>(read_height), 32));
|
||||||
psm.rtx(mem, mem.GetOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM), block_rect, buffer.GetPtr(), pitch, TEXA);
|
psm.rtx(mem, mem.GetOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM), block_rect, buffer, pitch, TEXA);
|
||||||
|
|
||||||
// okay, now we can actually dump it
|
// okay, now we can actually dump it
|
||||||
const u32 buffer_offset = ((rect.top - block_rect.top) * pitch) + ((rect.left - block_rect.left) * sizeof(u32));
|
const u32 buffer_offset = ((rect.top - block_rect.top) * pitch) + ((rect.left - block_rect.left) * sizeof(u32));
|
||||||
QueueWorkerThreadItem([filename = std::move(filename), tw, th, pitch, buffer = std::move(buffer), buffer_offset]() {
|
QueueWorkerThreadItem([filename = std::move(filename), tw, th, pitch, buffer, buffer_offset]() {
|
||||||
if (!SavePNGImage(filename.c_str(), tw, th, buffer.GetPtr() + buffer_offset, pitch))
|
if (!SavePNGImage(filename.c_str(), tw, th, buffer + buffer_offset, pitch))
|
||||||
Console.Error("Failed to dump texture to '%s'.", filename.c_str());
|
Console.Error(fmt::format("Failed to dump texture to '{}'.", filename));
|
||||||
|
_aligned_free(buffer);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,6 @@ public:
|
||||||
bool Save(const std::string& fn) final;
|
bool Save(const std::string& fn) final;
|
||||||
void Swap(GSTexture* tex) final;
|
void Swap(GSTexture* tex) final;
|
||||||
|
|
||||||
GSMap Read(const GSVector4i& r, AlignedBuffer<u8, 32>& buffer);
|
|
||||||
bool IsIntegerFormat() const
|
bool IsIntegerFormat() const
|
||||||
{
|
{
|
||||||
return (m_int_format == GL_RED_INTEGER || m_int_format == GL_RGBA_INTEGER);
|
return (m_int_format == GL_RED_INTEGER || m_int_format == GL_RGBA_INTEGER);
|
||||||
|
|
Loading…
Reference in New Issue