GLPostProcessor.hh 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #ifndef GLPOSTPROCESSOR_HH
  2. #define GLPOSTPROCESSOR_HH
  3. #include "PostProcessor.hh"
  4. #include "RenderSettings.hh"
  5. #include "GLUtil.hh"
  6. #include <utility>
  7. #include <vector>
  8. #include <memory>
  9. namespace openmsx {
  10. class GLScaler;
  11. class MSXMotherBoard;
  12. class Display;
  13. /** Rasterizer using SDL.
  14. */
  15. class GLPostProcessor final : public PostProcessor
  16. {
  17. public:
  18. GLPostProcessor(
  19. MSXMotherBoard& motherBoard, Display& display,
  20. OutputSurface& screen, const std::string& videoSource,
  21. unsigned maxWidth, unsigned height, bool canDoInterlace);
  22. ~GLPostProcessor() override;
  23. // Layer interface:
  24. void paint(OutputSurface& output) override;
  25. std::unique_ptr<RawFrame> rotateFrames(
  26. std::unique_ptr<RawFrame> finishedFrame, EmuTime::param time) override;
  27. protected:
  28. // Observer<Setting> interface:
  29. void update(const Setting& setting) override;
  30. private:
  31. void initBuffers();
  32. void createRegions();
  33. void uploadFrame();
  34. void uploadBlock(unsigned srcStartY, unsigned srcEndY,
  35. unsigned lineWidth);
  36. void preCalcNoise(float factor);
  37. void drawNoise();
  38. void drawGlow(int glow);
  39. void preCalcMonitor3D(float width);
  40. void drawMonitor3D();
  41. /** The currently active scaler.
  42. */
  43. std::unique_ptr<GLScaler> currScaler;
  44. gl::Texture colorTex[2];
  45. gl::FrameBufferObject fbo[2];
  46. // Noise effect:
  47. gl::Texture noiseTextureA;
  48. gl::Texture noiseTextureB;
  49. float noiseX, noiseY;
  50. struct TextureData {
  51. gl::ColorTexture tex;
  52. gl::PixelBuffer<unsigned> pbo;
  53. };
  54. std::vector<std::pair<unsigned, TextureData>> textures;
  55. gl::ColorTexture superImposeTex;
  56. struct Region {
  57. Region(unsigned srcStartY_, unsigned srcEndY_,
  58. unsigned dstStartY_, unsigned dstEndY_,
  59. unsigned lineWidth_)
  60. : srcStartY(srcStartY_)
  61. , srcEndY(srcEndY_)
  62. , dstStartY(dstStartY_)
  63. , dstEndY(dstEndY_)
  64. , lineWidth(lineWidth_) {}
  65. unsigned srcStartY;
  66. unsigned srcEndY;
  67. unsigned dstStartY;
  68. unsigned dstEndY;
  69. unsigned lineWidth;
  70. };
  71. std::vector<Region> regions;
  72. unsigned height;
  73. unsigned frameCounter;
  74. /** Currently active scale algorithm, used to detect scaler changes.
  75. */
  76. RenderSettings::ScaleAlgorithm scaleAlgorithm;
  77. gl::VertexArray monitor3DVAO;
  78. gl::ShaderProgram monitor3DProg;
  79. gl::BufferObject arrayBuffer;
  80. gl::BufferObject elementbuffer;
  81. gl::VertexArray vao;
  82. gl::VertexArray glowVAO;
  83. gl::BufferObject vbo[2];
  84. gl::BufferObject stretchVBO;
  85. gl::VertexArray noiseVAO;
  86. gl::BufferObject noiseVBO[2];
  87. bool storedFrame;
  88. };
  89. } // namespace openmsx
  90. #endif // GLPOSTPROCESSOR_HH