openMSX
GLSaIScaler.cc
Go to the documentation of this file.
1 #include "GLSaIScaler.hh"
2 #include "memory.hh"
3 
4 using std::string;
5 
6 namespace openmsx {
7 
9 {
10  for (int i = 0; i < 2; ++i) {
11  string header = string("#define SUPERIMPOSE ")
12  + char('0' + i) + '\n';
13  VertexShader vertexShader (header, "sai.vert");
14  FragmentShader fragmentShader(header, "sai.frag");
15  scalerProgram[i].attach(vertexShader);
16  scalerProgram[i].attach(fragmentShader);
17  scalerProgram[i].link();
18 #ifdef GL_VERSION_2_0
19  if (GLEW_VERSION_2_0) {
20  scalerProgram[i].activate();
21  glUniform1i(scalerProgram[i].getUniformLocation("tex"), 0);
22  if (i == 1) {
23  glUniform1i(scalerProgram[i].getUniformLocation("videoTex"), 1);
24  }
25  texSizeLoc[i] = scalerProgram[i].getUniformLocation("texSize");
26  }
27 #endif
28  }
29 }
30 
32  ColorTexture& src, ColorTexture* superImpose,
33  unsigned srcStartY, unsigned srcEndY, unsigned srcWidth,
34  unsigned dstStartY, unsigned dstEndY, unsigned dstWidth,
35  unsigned logSrcHeight)
36 {
37  int i = superImpose ? 1 : 0;
38  if (superImpose) {
39  glActiveTexture(GL_TEXTURE1);
40  superImpose->bind();
41  glActiveTexture(GL_TEXTURE0);
42  }
43  scalerProgram[i].activate();
44  if (GLEW_VERSION_2_0) {
45  glUniform2f(texSizeLoc[i], srcWidth, src.getHeight());
46  }
47  drawMultiTex(src, srcStartY, srcEndY, src.getHeight(), logSrcHeight,
48  dstStartY, dstEndY, dstWidth);
49 }
50 
51 } // namespace openmsx