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) \
|
||||
_aligned_realloc(handle, new_size, align)
|
||||
#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
|
||||
// must be 32 byte aligned for ReadTexture().
|
||||
AlignedBuffer<u8, 32> buffer(pitch * static_cast<u32>(read_height));
|
||||
psm.rtx(mem, mem.GetOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM), block_rect, buffer.GetPtr(), pitch, TEXA);
|
||||
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, pitch, TEXA);
|
||||
|
||||
// okay, now we can actually dump it
|
||||
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]() {
|
||||
if (!SavePNGImage(filename.c_str(), tw, th, buffer.GetPtr() + buffer_offset, pitch))
|
||||
Console.Error("Failed to dump texture to '%s'.", filename.c_str());
|
||||
QueueWorkerThreadItem([filename = std::move(filename), tw, th, pitch, buffer, buffer_offset]() {
|
||||
if (!SavePNGImage(filename.c_str(), tw, th, buffer + buffer_offset, pitch))
|
||||
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;
|
||||
void Swap(GSTexture* tex) final;
|
||||
|
||||
GSMap Read(const GSVector4i& r, AlignedBuffer<u8, 32>& buffer);
|
||||
bool IsIntegerFormat() const
|
||||
{
|
||||
return (m_int_format == GL_RED_INTEGER || m_int_format == GL_RGBA_INTEGER);
|
||||
|
|
Loading…
Reference in New Issue