Skip to content

Commit

Permalink
Add CreateTextureFromFileData (without ManagedTexture)
Browse files Browse the repository at this point in the history
  • Loading branch information
hrydgard committed Dec 12, 2023
1 parent d2e10a0 commit 82bdc9e
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 27 deletions.
61 changes: 36 additions & 25 deletions Common/Render/ManagedTexture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,45 +116,56 @@ bool TempImage::LoadTextureLevels(const uint8_t *data, size_t size, ImageFileTyp
return numLevels > 0;
}

bool ManagedTexture::LoadFromFileData(const uint8_t *data, size_t dataSize, ImageFileType type, bool generateMips, const char *name) {
generateMips_ = generateMips;
Draw::Texture *CreateTextureFromTempImage(Draw::DrawContext *draw, const uint8_t *data, size_t dataSize, const TempImage &image, bool generateMips, const char *name) {
using namespace Draw;

TempImage image;
if (!image.LoadTextureLevels(data, dataSize, type)) {
return false;
}

_assert_(image.levels[0] != nullptr);
_assert_(image.levels[0] != nullptr && image.width[0] > 0 && image.height[0] > 0);

int numLevels = image.numLevels;
if (numLevels < 0 || numLevels >= 16) {
ERROR_LOG(IO, "Invalid num_levels: %d. Falling back to one. Image: %dx%d", numLevels, image.width[0], image.height[0]);
numLevels = 1;
}

int potentialLevels = std::min(log2i(image.width[0]), log2i(image.height[0]));
TextureDesc desc{};
desc.type = TextureType::LINEAR2D;
desc.format = image.fmt;
desc.width = image.width[0];
desc.height = image.height[0];
desc.depth = 1;
desc.mipLevels = generateMips ? potentialLevels : image.numLevels;
desc.generateMips = generateMips && potentialLevels > image.numLevels;
desc.tag = name;
for (int i = 0; i < image.numLevels; i++) {
desc.initData.push_back(image.levels[i]);
}
return draw->CreateTexture(desc);
}

Draw::Texture *CreateTextureFromFileData(Draw::DrawContext *draw, const uint8_t *data, size_t dataSize, ImageFileType type, bool generateMips, const char *name) {
TempImage image;
if (!image.LoadTextureLevels(data, dataSize, type)) {
return nullptr;
}
Draw::Texture *texture = CreateTextureFromTempImage(draw, data, dataSize, image, generateMips, name);
image.Free();
return texture;
}

bool ManagedTexture::LoadFromFileData(const uint8_t *data, size_t dataSize, ImageFileType type, bool generateMips, const char *name) {
generateMips_ = generateMips;

// Free the old texture, if any.
if (texture_) {
delete texture_;
texture_->Release();
texture_ = nullptr;
}

int potentialLevels = std::min(log2i(image.width[0]), log2i(image.height[0]));
if (image.width[0] > 0 && image.height[0] > 0) {
TextureDesc desc{};
desc.type = TextureType::LINEAR2D;
desc.format = image.fmt;
desc.width = image.width[0];
desc.height = image.height[0];
desc.depth = 1;
desc.mipLevels = generateMips ? potentialLevels : image.numLevels;
desc.generateMips = generateMips && potentialLevels > image.numLevels;
desc.tag = name;
for (int i = 0; i < image.numLevels; i++) {
desc.initData.push_back(image.levels[i]);
}
texture_ = draw_->CreateTexture(desc);
TempImage image;
if (!image.LoadTextureLevels(data, dataSize, type)) {
return false;
}
texture_ = CreateTextureFromTempImage(draw_, data, dataSize, image, generateMips, name);
image.Free();
return texture_ != nullptr;
}
Expand Down
3 changes: 2 additions & 1 deletion Common/Render/ManagedTexture.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class ManagedTexture {
bool loadPending_ = false;
};

Draw::Texture *CreateTextureFromFileData(Draw::DrawContext *draw, const uint8_t *data, size_t dataSize, ImageFileType type, bool generateMips, const char *name);

std::unique_ptr<ManagedTexture> CreateManagedTextureFromFile(Draw::DrawContext *draw, const char *filename, ImageFileType fileType, bool generateMips);
std::unique_ptr<ManagedTexture> CreateManagedTextureFromFileData(Draw::DrawContext *draw, const uint8_t *data, int size, ImageFileType fileType, bool generateMips, const char *name);

2 changes: 1 addition & 1 deletion UI/GameInfoCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -760,7 +760,7 @@ void GameInfoCache::WaitUntilDone(std::shared_ptr<GameInfo> &info) {
}

// Runs on the main thread. Only call from render() and similar, not update()!
// Can also be called from the audio thread for menu background music.
// Can also be called from the audio thread for menu background music, but that cannot request images!
std::shared_ptr<GameInfo> GameInfoCache::GetInfo(Draw::DrawContext *draw, const Path &gamePath, int wantFlags) {
std::shared_ptr<GameInfo> info;

Expand Down

0 comments on commit 82bdc9e

Please sign in to comment.