X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect.h;h=f404d3994adbfc6aa7c57647a0e7316ad1b37604;hp=a1852fc12e09f9a1abf454d0167241b26c7d3e1a;hb=f0c77209245aa206996c7ef5395888e2859ff4bf;hpb=7fd447b922234670ae65066915b65a1b4816e095 diff --git a/effect.h b/effect.h index a1852fc..f404d39 100644 --- a/effect.h +++ b/effect.h @@ -169,12 +169,37 @@ public: // either will be fine. virtual bool needs_texture_bounce() const { return false; } - // Whether this effect expects mipmaps or not. If you set this to - // true, you will be sampling with bilinear filtering; if not, - // you could be sampling with simple linear filtering and no mipmaps - // (although there is no guarantee; if a different effect in the chain - // needs mipmaps, you will also get them). - virtual bool needs_mipmaps() const { return false; } + // Whether this effect expects mipmaps or not. + enum MipmapRequirements { + // If chosen, you will be sampling with bilinear filtering, + // ie. the closest mipmap will be chosen, and then there will be + // bilinear interpolation inside it (GL_LINEAR_MIPMAP_NEAREST). + NEEDS_MIPMAPS, + + // Whether the effect doesn't really care whether input textures + // are with or without mipmaps. You could get the same effect + // as NEEDS_MIPMAPS or CANNOT_ACCEPT_MIPMAPS; normally, you won't + // get them, but if a different effect in the same phase needs mipmaps, + // you will also get them. + DOES_NOT_NEED_MIPMAPS, + + // The opposite of NEEDS_MIPMAPS; you will always be sampling from + // the most detailed mip level (GL_LINEAR). Effects with NEEDS_MIPMAPS + // and CANNOT_ACCEPT_MIPMAPS can not coexist within the same phase; + // such phases will be split. + // + // This is the only choice that makes sense for a compute shader, + // given that it doesn't have screen-space derivatives and thus + // always will sample the most detailed mip level. + CANNOT_ACCEPT_MIPMAPS, + }; + virtual MipmapRequirements needs_mipmaps() const { + if (is_compute_shader()) { + return CANNOT_ACCEPT_MIPMAPS; + } else { + return DOES_NOT_NEED_MIPMAPS; + } + } // Whether there is a direct correspondence between input and output // texels. Specifically, the effect must not: @@ -200,9 +225,9 @@ public: virtual bool one_to_one_sampling() const { return strong_one_to_one_sampling(); } // Similar in use to one_to_one_sampling(), but even stricter: - // The effect must not use texture coordinate in any way beyond - // giving it unmodified to its (single) input. This allows it to - // also be used after a compute shader, in the same phase. + // The effect must not modify texture coordinate in any way when + // calling its input(s). This allows it to also be used after + // a compute shader, in the same phase. // // An effect that it strong one-to-one must also be one-to-one. virtual bool strong_one_to_one_sampling() const { return false; }