Asynchronous streaming and memory management improvements in progress.

Stability improved.

--HG--
branch : async_streaming
This commit is contained in:
2013-11-16 03:22:31 -08:00
parent 8b29ffab69
commit 240d2ee278
2 changed files with 9 additions and 4 deletions

View File

@@ -34,7 +34,7 @@
#include "KREngine-common.h" #include "KREngine-common.h"
#define KRENGINE_MIN_MMAP 327680000 #define KRENGINE_MIN_MMAP 32768
class KRDataBlock { class KRDataBlock {
public: public:

View File

@@ -20,6 +20,7 @@ KRTexture::KRTexture(KRContext &context, std::string name) : KRResource(context,
m_newTextureMemUsed = 0; m_newTextureMemUsed = 0;
m_last_frame_used = 0; m_last_frame_used = 0;
m_last_frame_bound = 0; m_last_frame_bound = 0;
m_handle_lock.clear();
} }
KRTexture::~KRTexture() KRTexture::~KRTexture()
@@ -30,6 +31,8 @@ KRTexture::~KRTexture()
void KRTexture::releaseHandles() { void KRTexture::releaseHandles() {
long mem_size = getMemSize(); long mem_size = getMemSize();
while(m_handle_lock.test_and_set()); // Spin lock
if(m_iNewHandle != 0) { if(m_iNewHandle != 0) {
GLDEBUG(glDeleteTextures(1, &m_iNewHandle)); GLDEBUG(glDeleteTextures(1, &m_iNewHandle));
m_iNewHandle = 0; m_iNewHandle = 0;
@@ -40,6 +43,9 @@ void KRTexture::releaseHandles() {
m_iHandle = 0; m_iHandle = 0;
m_textureMemUsed = 0; m_textureMemUsed = 0;
} }
m_handle_lock.clear();
getContext().getTextureManager()->memoryChanged(-mem_size); getContext().getTextureManager()->memoryChanged(-mem_size);
} }
@@ -54,7 +60,7 @@ long KRTexture::getReferencedMemSize() {
void KRTexture::resize(int max_dim) void KRTexture::resize(int max_dim)
{ {
if(m_handle_lock.test_and_set()) if(!m_handle_lock.test_and_set())
{ {
if(m_iHandle == m_iNewHandle) { if(m_iHandle == m_iNewHandle) {
if(max_dim == 0) { if(max_dim == 0) {
@@ -134,8 +140,7 @@ bool KRTexture::canStreamOut() const {
void KRTexture::_swapHandles() void KRTexture::_swapHandles()
{ {
if(m_handle_lock.test_and_set()) if(!m_handle_lock.test_and_set()) {
{
if(m_iHandle != m_iNewHandle) { if(m_iHandle != m_iNewHandle) {
if(m_iHandle != 0) { if(m_iHandle != 0) {
GLDEBUG(glDeleteTextures(1, &m_iHandle)); GLDEBUG(glDeleteTextures(1, &m_iHandle));