Commit 05d842bc authored by Vladislav Vinogradov's avatar Vladislav Vinogradov

a bit more opengl refactoring:

* added Access parameter to GlBuffer::mapHost
* added autoRelease parameter to all create methods
* fixed indentation in gl_core_3_1
* minor improvments for opengl sample
parent 08fbf667
...@@ -71,6 +71,13 @@ public: ...@@ -71,6 +71,13 @@ public:
PIXEL_UNPACK_BUFFER = 0x88EC //!< The buffer will be used for writing to OpenGL textures PIXEL_UNPACK_BUFFER = 0x88EC //!< The buffer will be used for writing to OpenGL textures
}; };
enum Access
{
READ_ONLY = 0x88B8,
WRITE_ONLY = 0x88B9,
READ_WRITE = 0x88BA
};
//! create empty buffer //! create empty buffer
GlBuffer(); GlBuffer();
...@@ -79,15 +86,15 @@ public: ...@@ -79,15 +86,15 @@ public:
GlBuffer(Size asize, int atype, unsigned int abufId, bool autoRelease = false); GlBuffer(Size asize, int atype, unsigned int abufId, bool autoRelease = false);
//! create buffer //! create buffer
GlBuffer(int arows, int acols, int atype, Target target = ARRAY_BUFFER); GlBuffer(int arows, int acols, int atype, Target target = ARRAY_BUFFER, bool autoRelease = false);
GlBuffer(Size asize, int atype, Target target = ARRAY_BUFFER); GlBuffer(Size asize, int atype, Target target = ARRAY_BUFFER, bool autoRelease = false);
//! copy from host/device memory //! copy from host/device memory
explicit GlBuffer(InputArray arr, Target target = ARRAY_BUFFER); explicit GlBuffer(InputArray arr, Target target = ARRAY_BUFFER, bool autoRelease = false);
//! create buffer //! create buffer
void create(int arows, int acols, int atype, Target target = ARRAY_BUFFER); void create(int arows, int acols, int atype, Target target = ARRAY_BUFFER, bool autoRelease = false);
void create(Size asize, int atype, Target target = ARRAY_BUFFER) { create(asize.height, asize.width, atype, target); } void create(Size asize, int atype, Target target = ARRAY_BUFFER, bool autoRelease = false) { create(asize.height, asize.width, atype, target, autoRelease); }
//! release memory and delete buffer object //! release memory and delete buffer object
void release(); void release();
...@@ -96,7 +103,7 @@ public: ...@@ -96,7 +103,7 @@ public:
void setAutoRelease(bool flag); void setAutoRelease(bool flag);
//! copy from host/device memory //! copy from host/device memory
void copyFrom(InputArray arr, Target target = ARRAY_BUFFER); void copyFrom(InputArray arr, Target target = ARRAY_BUFFER, bool autoRelease = false);
//! copy to host/device memory //! copy to host/device memory
void copyTo(OutputArray arr, Target target = ARRAY_BUFFER) const; void copyTo(OutputArray arr, Target target = ARRAY_BUFFER) const;
...@@ -111,7 +118,7 @@ public: ...@@ -111,7 +118,7 @@ public:
static void unbind(Target target); static void unbind(Target target);
//! map to host memory //! map to host memory
Mat mapHost(); Mat mapHost(Access access);
void unmapHost(); void unmapHost();
//! map to device memory //! map to device memory
...@@ -162,15 +169,15 @@ public: ...@@ -162,15 +169,15 @@ public:
GlTexture2D(Size asize, Format aformat, unsigned int atexId, bool autoRelease = false); GlTexture2D(Size asize, Format aformat, unsigned int atexId, bool autoRelease = false);
//! create texture //! create texture
GlTexture2D(int arows, int acols, Format aformat); GlTexture2D(int arows, int acols, Format aformat, bool autoRelease = false);
GlTexture2D(Size asize, Format aformat); GlTexture2D(Size asize, Format aformat, bool autoRelease = false);
//! copy from host/device memory //! copy from host/device memory
explicit GlTexture2D(InputArray arr); explicit GlTexture2D(InputArray arr, bool autoRelease = false);
//! create texture //! create texture
void create(int arows, int acols, Format aformat); void create(int arows, int acols, Format aformat, bool autoRelease = false);
void create(Size asize, Format aformat) { create(asize.height, asize.width, aformat); } void create(Size asize, Format aformat, bool autoRelease = false) { create(asize.height, asize.width, aformat, autoRelease); }
//! release memory and delete texture object //! release memory and delete texture object
void release(); void release();
...@@ -179,7 +186,7 @@ public: ...@@ -179,7 +186,7 @@ public:
void setAutoRelease(bool flag); void setAutoRelease(bool flag);
//! copy from host/device memory //! copy from host/device memory
void copyFrom(InputArray arr); void copyFrom(InputArray arr, bool autoRelease = false);
//! copy to host/device memory //! copy to host/device memory
void copyTo(OutputArray arr, int ddepth = CV_32F) const; void copyTo(OutputArray arr, int ddepth = CV_32F) const;
......
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
...@@ -351,14 +351,14 @@ TEST_P(GlBuffer, Clone) ...@@ -351,14 +351,14 @@ TEST_P(GlBuffer, Clone)
cv::destroyAllWindows(); cv::destroyAllWindows();
} }
TEST_P(GlBuffer, MapHost) TEST_P(GlBuffer, MapHostRead)
{ {
cv::namedWindow("test", cv::WINDOW_OPENGL); cv::namedWindow("test", cv::WINDOW_OPENGL);
cv::Mat gold = randomMat(size, type); cv::Mat gold = randomMat(size, type);
cv::GlBuffer buf(gold); cv::GlBuffer buf(gold);
cv::Mat dst = buf.mapHost(); cv::Mat dst = buf.mapHost(cv::GlBuffer::READ_ONLY);
EXPECT_MAT_NEAR(gold, dst, 0); EXPECT_MAT_NEAR(gold, dst, 0);
...@@ -368,6 +368,27 @@ TEST_P(GlBuffer, MapHost) ...@@ -368,6 +368,27 @@ TEST_P(GlBuffer, MapHost)
cv::destroyAllWindows(); cv::destroyAllWindows();
} }
TEST_P(GlBuffer, MapHostWrite)
{
cv::namedWindow("test", cv::WINDOW_OPENGL);
cv::Mat gold = randomMat(size, type);
cv::GlBuffer buf(size, type);
cv::Mat dst = buf.mapHost(cv::GlBuffer::WRITE_ONLY);
gold.copyTo(dst);
buf.unmapHost();
dst.release();
cv::Mat bufData;
buf.copyTo(bufData);
EXPECT_MAT_NEAR(gold, bufData, 0);
buf.release();
cv::destroyAllWindows();
}
TEST_P(GlBuffer, MapDevice) TEST_P(GlBuffer, MapDevice)
{ {
cv::namedWindow("test", cv::WINDOW_OPENGL); cv::namedWindow("test", cv::WINDOW_OPENGL);
......
...@@ -56,14 +56,18 @@ void CV_CDECL draw(void* userdata) ...@@ -56,14 +56,18 @@ void CV_CDECL draw(void* userdata)
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
gluLookAt(0, 0, 4, 0, 0, 0, 0, 1, 0); gluLookAt(0, 0, 3, 0, 0, 0, 0, 1, 0);
glRotated(angle, 0, 1, 0); glRotated(angle, 0, 1, 0);
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
data->tex.bind(); data->tex.bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
render(data->arr, data->indices, RenderMode::TRIANGLES); render(data->arr, data->indices, RenderMode::TRIANGLES);
...@@ -101,13 +105,8 @@ int main(int argc, char* argv[]) ...@@ -101,13 +105,8 @@ int main(int argc, char* argv[])
data.arr.setVertexArray(vertex); data.arr.setVertexArray(vertex);
data.arr.setTexCoordArray(texCoords); data.arr.setTexCoordArray(texCoords);
data.arr.setAutoRelease(false);
data.indices.copyFrom(indices); data.indices.copyFrom(indices);
data.indices.setAutoRelease(false);
data.tex.copyFrom(img); data.tex.copyFrom(img);
data.tex.setAutoRelease(false);
setOpenGlDrawCallback("OpenGL", draw, &data); setOpenGlDrawCallback("OpenGL", draw, &data);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment