]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Add multisampled texture types to the shader compiler
[libs/gl.git] / source / glsl / spirv.cpp
index c6f15614f5c8a56a36c7e7236a1c785f081e0a19..61e2d594e6c641105379dfd6c671a82b1991f5fa 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,6 +1296,8 @@ 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");
 
@@ -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);