Browse Source

disallow texture:replacePixels and non-canvas textures for depth/stencil pixel formats.

Sasha Szpakowski 1 year ago
parent
commit
906f615a9e
2 changed files with 17 additions and 5 deletions
  1. 11 5
      src/modules/graphics/Graphics.cpp
  2. 6 0
      src/modules/graphics/Texture.cpp

+ 11 - 5
src/modules/graphics/Graphics.cpp

@@ -547,6 +547,7 @@ Texture *Graphics::getDefaultTexture(TextureType type, DataBaseType dataType, bo
 
 	Texture::Settings settings;
 	settings.type = type;
+	settings.readable.set(true);
 
 	switch (dataType)
 	{
@@ -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))
@@ -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;
 

+ 6 - 0
src/modules/graphics/Texture.cpp

@@ -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))
@@ -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.");