Skip to content

Commit

Permalink
disallow texture:replacePixels and non-canvas textures for depth/sten…
Browse files Browse the repository at this point in the history
…cil pixel formats.
  • Loading branch information
slime73 committed Jul 15, 2024
1 parent bb5cea6 commit 906f615
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
16 changes: 11 additions & 5 deletions src/modules/graphics/Graphics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,7 @@ Texture *Graphics::getDefaultTexture(TextureType type, DataBaseType dataType, bo

Texture::Settings settings;
settings.type = type;
settings.readable.set(true);

switch (dataType)
{
Expand All @@ -564,6 +565,8 @@ Texture *Graphics::getDefaultTexture(TextureType type, DataBaseType dataType, bo

if (depthSample)
{
settings.renderTarget = true;

if (isPixelFormatSupported(PIXELFORMAT_DEPTH16_UNORM, PIXELFORMATUSAGE_SAMPLE))
settings.format = PIXELFORMAT_DEPTH16_UNORM;
else if (isPixelFormatSupported(PIXELFORMAT_DEPTH24_UNORM, PIXELFORMATUSAGE_SAMPLE))
Expand Down Expand Up @@ -597,12 +600,15 @@ Texture *Graphics::getDefaultTexture(TextureType type, DataBaseType dataType, bo

tex->setSamplerState(s);

uint8 pixel[] = {255, 255, 255, 255};
if (isPixelFormatInteger(settings.format))
pixel[0] = pixel[1] = pixel[2] = pixel[3] = 1;
if (!depthSample)
{
uint8 pixel[] = {255, 255, 255, 255};
if (isPixelFormatInteger(settings.format))
pixel[0] = pixel[1] = pixel[2] = pixel[3] = 1;

for (int slice = 0; slice < (type == TEXTURE_CUBE ? 6 : 1); slice++)
tex->replacePixels(pixel, sizeof(pixel), slice, 0, {0, 0, 1, 1}, false);
for (int slice = 0; slice < (type == TEXTURE_CUBE ? 6 : 1); slice++)
tex->replacePixels(pixel, sizeof(pixel), slice, 0, {0, 0, 1, 1}, false);
}

defaultTextures[type][dataType][depthsampleindex] = tex;

Expand Down
6 changes: 6 additions & 0 deletions src/modules/graphics/Texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,9 @@ Texture::Texture(Graphics *gfx, const Settings &settings, const Slices *slices)
if (isCompressed() && renderTarget)
throw love::Exception("Compressed textures cannot be render targets.");

if (isPixelFormatDepthStencil(format) && !renderTarget)
throw love::Exception("Depth or stencil pixel formats are only supported with render target textures.");

for (PixelFormat viewformat : viewFormats)
{
if (getLinearPixelFormat(viewformat) == getLinearPixelFormat(format))
Expand Down Expand Up @@ -582,6 +585,9 @@ void Texture::replacePixels(love::image::ImageDataBase *d, int slice, int mipmap
if (getMSAA() > 1)
throw love::Exception("replacePixels cannot be called on a MSAA Texture.");

if (isPixelFormatDepthStencil(format))
throw love::Exception("replacePixels cannot be called on depth or stencil Textures.");

auto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);
if (gfx != nullptr && gfx->isRenderTargetActive(this))
throw love::Exception("replacePixels cannot be called on this Texture while it's an active render target.");
Expand Down

0 comments on commit 906f615

Please sign in to comment.