1 #ifndef _ESEXTCTEXTUREBUFFERPARAMETERS_HPP
2 #define _ESEXTCTEXTUREBUFFERPARAMETERS_HPP
3 /*-------------------------------------------------------------------------
4  * OpenGL Conformance Test Suite
5  * -----------------------------
6  *
7  * Copyright (c) 2014-2016 The Khronos Group Inc.
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  */ /*!
22  * \file
23  * \brief
24  */ /*-------------------------------------------------------------------*/
25 
26 /*!
27  * \file  esextcTextureBufferParameters.hpp
28  * \brief Texture Buffer GetTexLevelParameter and GetIntegerv test (Test 6)
29  */ /*-------------------------------------------------------------------*/
30 
31 #include "../esextcTestCaseBase.hpp"
32 #include "gluShaderUtil.hpp"
33 #include "tcuDefs.hpp"
34 #include <map>
35 
36 namespace glcts
37 {
38 
39 /**   Implementation of (Test 6) from CTS_EXT_texture_buffer. Description follows:
40  *
41  *    Test whether for correctly configured texture buffer with attached
42  *    buffer object used as data store, GetTexLevelParameter and GetIntegerv
43  *    functions return correct values for new tokens specified in the extension
44  *    specification.
45  *
46  *    Category: API.
47  *
48  *    The test should create a texture object and bind it to TEXTURE_BUFFER_EXT
49  *    texture target at texture unit 0. It should also create buffer object and
50  *    bind it to TEXTURE_BUFFER_EXT target.
51  *
52  *    The function glGetIntegerv called with TEXTURE_BINDING_BUFFER_EXT parameter
53  *    name should return the id of the texture object bound to TEXTURE_BUFFER_EXT
54  *    binding point for the active texture image unit.
55  *
56  *    The function glGetIntegerv called with TEXTURE_BUFFER_BINDING_EXT parameter
57  *    name should return the id of the buffer object bound to the TEXTURE_BUFFER_EXT
58  *    binding point.
59  *
60  *    The test should iterate over all formats supported by texture buffer
61  *    listed in table texbo.1
62  *
63  *    For each format it should allocate memory block of size 128 *
64  *    texel_size_for_format.
65  *
66  *    Use glBufferData to initialize a buffer object's data store.
67  *    glBufferData should be given a pointer to allocated memory that will be
68  *    copied into the data store for initialization.
69  *
70  *    The buffer object should be used as texture buffer's data store by calling
71  *
72  *    TexBufferEXT(TEXTURE_BUFFER_EXT, format_name, buffer_id );
73  *
74  *    The function glGetTexLevelParameteriv called with
75  *    TEXTURE_BUFFER_DATA_STORE_BINDING_EXT parameter name should return id of
76  *    the buffer object whose data store is used by texture buffer.
77  *
78  *    The function glGetTexLevelParameteriv called with TEXTURE_INTERNAL_FORMAT
79  *    parameter name should return the name of the used format.
80  *
81  *    The function glGetTexLevelParameteriv called with
82  *    TEXTURE_BUFFER_OFFSET_EXT parameter name should return 0.
83  *
84  *    The function glGetTexLevelParameteriv called with TEXTURE_BUFFER_SIZE_EXT
85  *    parameter name should return 128 * texel_size_for_format.
86  *
87  *    The function glGetTexLevelParameteriv called with one of the above parameter
88  *    names and a non-zero lod should generate INVALID_VALUE error.
89  *
90  *    Call:
91  *
92  *    GLint offset_alignment = 0;
93  *    GetIntegerv(TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT, &offset_alignment);
94  *
95  *    Resize the buffer's data store using glBufferData to
96  *    256 * texel_size_for_format + offset_alignment while it's bound to the
97  *    texture buffer.
98  *
99  *    The function glGetTexLevelParameteriv called with
100  *    TEXTURE_BUFFER_OFFSET_EXT parameter name should return 0.
101  *
102  *    The function glGetTexLevelParameteriv called with TEXTURE_BUFFER_SIZE_EXT
103  *    parameter name should return 256 * texel_size_for_format.
104  *
105  *    Call:
106  *
107  *    TexBufferRangeEXT(TEXTURE_BUFFER_EXT, format_name, buffer_id,
108  *        offset_alignment, 256 * texel_size_for_format);
109  *
110  *    The function glGetTexLevelParameteriv called with
111  *    TEXTURE_BUFFER_OFFSET_EXT parameter name should return offset_alignment.
112  *
113  *    The function glGetTexLevelParameteriv called with TEXTURE_BUFFER_SIZE_EXT
114  *    parameter name should return 256 * texel_size_for_format.
115  */
116 class TextureBufferParameters : public TestCaseBase
117 {
118 public:
119     /* Public methods */
120     TextureBufferParameters(Context &context, const ExtParameters &extParams, const char *name,
121                             const char *description);
122 
~TextureBufferParameters()123     virtual ~TextureBufferParameters()
124     {
125     }
126 
127     virtual void deinit(void);
128     virtual IterateResult iterate(void);
129 
130 private:
131     /* Private methods */
132     void initTest(void);
133 
134     glw::GLboolean queryTextureBindingBuffer(glw::GLint expected);
135     glw::GLboolean queryTextureBufferBinding(glw::GLint expected);
136     glw::GLboolean queryTextureBufferDataStoreBinding(glw::GLint expected);
137     glw::GLboolean queryTextureBufferOffset(glw::GLint expected);
138     glw::GLboolean queryTextureBufferSize(glw::GLint expected);
139     glw::GLboolean queryTextureInternalFormat(glw::GLint expected);
140     glw::GLboolean queryTextureInvalidLevel();
141 
142     static const glw::GLuint m_n_texels_phase_one;
143     static const glw::GLuint m_n_texels_phase_two;
144 
145     typedef std::map<glw::GLint, glw::GLuint> InternalFormatsMap;
146 
147     /* Private variables */
148     InternalFormatsMap m_internal_formats; /* Maps internal format to texel size for that format */
149     glw::GLuint m_tbo_id;                  /* Texture Buffer Object*/
150     glw::GLuint m_to_id;                   /* Texture Object*/
151 };
152 
153 } // namespace glcts
154 
155 #endif // _ESEXTCTEXTUREBUFFERPARAMETERS_HPP
156