]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Use the sampled image type for OpImageQueryLod
[libs/gl.git] / source / glsl / spirv.cpp
index c6f15614f5c8a56a36c7e7236a1c785f081e0a19..f8b36b26dbe03885f2f6bfb6b3259d4cc0511dc5 100644 (file)
@@ -111,6 +111,7 @@ const SpirVGenerator::BuiltinFunctionInfo SpirVGenerator::builtin_functions[] =
        { "textureSize", "", "", 0, { }, CAP_IMAGE_QUERY, &SpirVGenerator::visit_builtin_texture_query },
        { "textureQueryLod", "", "", 0, { }, CAP_IMAGE_QUERY, &SpirVGenerator::visit_builtin_texture_query },
        { "textureQueryLevels", "", "", 0, { }, CAP_IMAGE_QUERY, &SpirVGenerator::visit_builtin_texture_query },
+       { "textureSamples", "", "", 0, { }, CAP_IMAGE_QUERY, &SpirVGenerator::visit_builtin_texture_query },
        { "texture", "", "", 0, { }, 0, &SpirVGenerator::visit_builtin_texture },
        { "textureLod", "", "", 0, { }, 0, &SpirVGenerator::visit_builtin_texture },
        { "texelFetch", "", "", 0, { }, 0, &SpirVGenerator::visit_builtin_texel_fetch },
@@ -1295,13 +1296,15 @@ void SpirVGenerator::visit_builtin_texture_query(FunctionCall &call, const vecto
                opcode = OP_IMAGE_QUERY_LOD;
        else if(call.name=="textureQueryLevels")
                opcode = OP_IMAGE_QUERY_LEVELS;
+       else if(call.name=="textureSamples")
+               opcode = OP_IMAGE_QUERY_SAMPLES;
        else
                throw internal_error("invalid texture query call");
 
        ImageTypeDeclaration &image_arg0 = dynamic_cast<ImageTypeDeclaration &>(*call.arguments[0]->type);
 
        Id image_id;
-       if(image_arg0.sampled)
+       if(image_arg0.sampled && opcode!=OP_IMAGE_QUERY_LOD)
        {
                Id image_type_id = get_item(image_type_ids, get_id(image_arg0));
                image_id = write_expression(OP_IMAGE, image_type_id, argument_ids[0]);
@@ -1371,10 +1374,12 @@ void SpirVGenerator::visit_builtin_texel_fetch(FunctionCall &call, const vector<
        if(argument_ids.size()!=3)
                throw internal_error("invalid texelFetch call");
 
+       const ImageTypeDeclaration &image = dynamic_cast<const ImageTypeDeclaration &>(*call.arguments[0]->type);
+
        r_expression_result_id = begin_expression(OP_IMAGE_FETCH, get_id(*call.type), 4);
        for(unsigned i=0; i<2; ++i)
                writer.write(argument_ids[i]);
-       writer.write(2);  // Lod
+       writer.write(image.multisample ? 0x40 : 0x02);  // Sample or Lod
        writer.write(argument_ids.back());
        end_expression(OP_IMAGE_FETCH);
 }
@@ -1492,7 +1497,7 @@ void SpirVGenerator::visit(ImageTypeDeclaration &image)
        writer.write(image.dimensions-1);
        writer.write(image.shadow);
        writer.write(image.array);
-       writer.write(false);  // Multisample
+       writer.write(image.multisample);
        writer.write(image.sampled ? 1 : 2);
        writer.write(0);  // Format (unknown)
        writer.end_op(OP_TYPE_IMAGE);