tests: Accomodate optimal tiling images (for nvidia)
diff --git a/tests/xglrenderframework.cpp b/tests/xglrenderframework.cpp
index aa9f8bf..0a54ed3 100644
--- a/tests/xglrenderframework.cpp
+++ b/tests/xglrenderframework.cpp
@@ -365,12 +365,28 @@
m_imageInfo.layout = XGL_IMAGE_LAYOUT_GENERAL;
}
+static bool IsCompatible(XGL_FLAGS usage, XGL_FLAGS features)
+{
+ if ((usage & XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT) &&
+ !(features & XGL_FORMAT_IMAGE_SHADER_READ_BIT))
+ return false;
+ if ((usage & XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT) &&
+ !(features & XGL_FORMAT_IMAGE_SHADER_WRITE_BIT))
+ return false;
+ return true;
+}
+
void XglImage::init(uint32_t w, uint32_t h,
XGL_FORMAT fmt, XGL_FLAGS usage,
- XGL_IMAGE_TILING tiling)
+ XGL_IMAGE_TILING requested_tiling)
{
uint32_t mipCount;
+ XGL_FORMAT_PROPERTIES image_fmt;
+ XGL_IMAGE_TILING tiling;
+ XGL_RESULT err;
+ size_t size;
+
mipCount = 0;
uint32_t _w = w;
@@ -382,6 +398,28 @@
mipCount++;
}
+ size = sizeof(image_fmt);
+ err = xglGetFormatInfo(m_device->obj(), fmt,
+ XGL_INFO_TYPE_FORMAT_PROPERTIES,
+ &size, &image_fmt);
+ ASSERT_XGL_SUCCESS(err);
+
+ if (requested_tiling == XGL_LINEAR_TILING) {
+ if (IsCompatible(usage, image_fmt.linearTilingFeatures)) {
+ tiling = XGL_LINEAR_TILING;
+ } else if (IsCompatible(usage, image_fmt.optimalTilingFeatures)) {
+ tiling = XGL_OPTIMAL_TILING;
+ } else {
+ ASSERT_TRUE(false) << "Error: Cannot find requested tiling configuration";
+ }
+ } else if (IsCompatible(usage, image_fmt.optimalTilingFeatures)) {
+ tiling = XGL_OPTIMAL_TILING;
+ } else if (IsCompatible(usage, image_fmt.linearTilingFeatures)) {
+ tiling = XGL_LINEAR_TILING;
+ } else {
+ ASSERT_TRUE(false) << "Error: Cannot find requested tiling configuration";
+ }
+
XGL_IMAGE_CREATE_INFO imageCreateInfo = xgl_testing::Image::create_info();
imageCreateInfo.imageType = XGL_IMAGE_2D;
imageCreateInfo.format = fmt;