X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fspirv.cpp;h=61e2d594e6c641105379dfd6c671a82b1991f5fa;hp=c6f15614f5c8a56a36c7e7236a1c785f081e0a19;hb=215d5bed27ad3de92557ae1b631695a036d29741;hpb=f9244b13a4ae30d134dd7410664c045c9f2c1574 diff --git a/source/glsl/spirv.cpp b/source/glsl/spirv.cpp index c6f15614..61e2d594 100644 --- a/source/glsl/spirv.cpp +++ b/source/glsl/spirv.cpp @@ -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(*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);