From 61042e2bc4f0b97e666e83c5223dc824704f1664 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:14:33 -0700 Subject: [PATCH] libobs-d3d11: Store static textures in RAM (for rebuilding) --- libobs-d3d11/d3d11-subsystem.hpp | 5 ++++- libobs-d3d11/d3d11-texture2d.cpp | 36 ++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 078158232..44765d0cb 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -291,10 +291,13 @@ struct gs_texture_2d : gs_texture { bool genMipmaps = false; uint32_t sharedHandle = 0; - void InitSRD(vector &srd, const uint8_t **data); + vector> data; + + void InitSRD(vector &srd); void InitTexture(const uint8_t **data); void InitResourceView(); void InitRenderTargets(); + void BackupTexture(const uint8_t **data); inline gs_texture_2d() : gs_texture (NULL, GS_TEXTURE_2D, 0, GS_UNKNOWN) diff --git a/libobs-d3d11/d3d11-texture2d.cpp b/libobs-d3d11/d3d11-texture2d.cpp index 7e151afc9..d99d9ba34 100644 --- a/libobs-d3d11/d3d11-texture2d.cpp +++ b/libobs-d3d11/d3d11-texture2d.cpp @@ -18,13 +18,13 @@ #include #include "d3d11-subsystem.hpp" -void gs_texture_2d::InitSRD(vector &srd, - const uint8_t **data) +void gs_texture_2d::InitSRD(vector &srd) { uint32_t rowSizeBytes = width * gs_get_format_bpp(format); uint32_t texSizeBytes = height * rowSizeBytes / 8; size_t textures = type == GS_TEXTURE_2D ? 1 : 6; uint32_t actual_levels = levels; + size_t curTex = 0; if (!actual_levels) actual_levels = gs_get_total_levels(width, height); @@ -37,18 +37,40 @@ void gs_texture_2d::InitSRD(vector &srd, for (uint32_t j = 0; j < actual_levels; j++) { D3D11_SUBRESOURCE_DATA newSRD; - newSRD.pSysMem = *data; + newSRD.pSysMem = data[curTex++].data(); newSRD.SysMemPitch = newRowSize; newSRD.SysMemSlicePitch = newTexSize; srd.push_back(newSRD); newRowSize /= 2; newTexSize /= 4; - data++; } } } +void gs_texture_2d::BackupTexture(const uint8_t **data) +{ + this->data.resize(levels); + + uint32_t w = width; + uint32_t h = height; + uint32_t bbp = gs_get_format_bpp(format); + + for (uint32_t i = 0; i < levels; i++) { + if (!data[i]) + break; + + uint32_t texSize = bbp * w * h / 8; + this->data[i].resize(texSize); + + vector &subData = this->data[i]; + memcpy(&subData[0], data[i], texSize); + + w /= 2; + h /= 2; + } +} + void gs_texture_2d::InitTexture(const uint8_t **data) { vector srd; @@ -76,8 +98,10 @@ void gs_texture_2d::InitTexture(const uint8_t **data) if (isGDICompatible) td.MiscFlags |= D3D11_RESOURCE_MISC_GDI_COMPATIBLE; - if (data) - InitSRD(srd, data); + if (data) { + BackupTexture(data); + InitSRD(srd); + } hr = device->device->CreateTexture2D(&td, data ? srd.data() : NULL, texture.Assign());